Suite

Fusionner plusieurs lignes qui se chevauchent à l'aide de Python ?

Fusionner plusieurs lignes qui se chevauchent à l'aide de Python ?


J'ai un fichier de formes avec différentes caractéristiques de ligne, dont certaines se chevauchent. Existe-t-il un moyen de fusionner facilement toutes les lignes qui se chevauchent en une seule nouvelle fonctionnalité à l'aide de Python ?

J'ai vu quelques solutions pour les polygones qui se chevauchent, mais j'ai eu beaucoup plus de mal à trouver des exemples utilisant des lignes.


En Python en utilisant le fiona bibliothèque pour lire le fichier et galbé pour faire les opérations de géométrie, il est facile de fusionner les géométries. Par example:

import fiona import shapely.geometry import shapely.ops avec fiona.open(path) as src: merged_geometries = shapely.ops.linemerge([ shapely.geometry.shape(feature["geometry"]) pour feature in src])

La géométrie fusionnée sera soit une LineString, soit une MultiLineString selon qu'une seule ligne contiguë peut être formée ou non.

Vous pouvez ensuite réécrire le résultat dans un fichier de formes en utilisantfiona(voir la doc sur l'écriture de fichiers), ou bien faites ce que vous voulez avec.

avec fiona.open(chemin) comme src : crs = src.crs driver = src.driver schema = { "geometry": merged_geometries.geom_type, "properties": { "length": "float" } } avec fiona.open( out_path, "w", driver=driver, crs=crs, schema=schema) en tant que destination : dest.write({ "geometry": shapely.geometry.mapping(merged_geometries), "id":"-1", "properties ": { "length": merged_geometries.length } })

Fusion de fichiers GeoTIFF pour créer une mosaïque

Dans votre analyse, vous souhaiterez probablement travailler avec une zone plus grande qu'un seul fichier, de quelques tuiles à un site de terrain NEON entier. Dans ce didacticiel, nous montrerons comment utiliser l'utilitaire gdal_merge pour mosaïquer plusieurs tuiles ensemble. Vous devrez installer GDAL et les liaisons GDAL-python sur votre machine afin d'utiliser le code ci-dessous.

Objectifs

Après avoir terminé ce didacticiel, vous serez capable de :

  • Fusionner plusieurs tuiles raster geotif en un seul raster mosaïqué
  • Utilisez les fonctions raster2array pour lire un raster tif dans un tableau Python

Installer les packages Python

  • sous-processus
  • globe
  • gdal
  • osgeo
  • matplotlib
  • numpy

Télécharger les données

Sous-ensemble de données d'enseignement NEON : Data Institute 2018

Pour compléter ces documents, vous utiliserez les données disponibles dans les ensembles de données pédagogiques du NEON 2018 Data Institute disponibles en téléchargement.

Les données LiDAR et d'imagerie utilisées pour créer ce sous-ensemble de données d'enseignement raster ont été collectées sur les sites de terrain du National Ecological Observatory Network et traitées au siège de NEON. Tous les produits de données NEON sont accessibles sur le portail de données NEON.

Dans votre analyse, vous souhaiterez probablement travailler avec une zone plus grande qu'un seul fichier, de quelques tuiles à un site de terrain NEON entier. Dans ce didacticiel, nous montrerons comment utiliser l'utilitaire gdal_merge pour mosaïquer plusieurs tuiles ensemble.

Cela peut être fait en ligne de commande ou en tant que commande système via Python, comme indiqué dans cette leçon. Si vous avez installé Python à l'aide d'Anaconda , vous devriez avoir téléchargé gdal_merge.py dans votre dossier, dans un chemin similaire à C:UsersuserAppDataLocalContinuumAnaconda3Scripts . Vous pouvez également le télécharger ici et l'enregistrer dans votre répertoire de travail. Pour plus de détails sur gdal_merge, reportez-vous au site Web de gdal.

Nous allons commencer par importer les packages suivants :

Faites une liste des fichiers à mosaïquer à l'aide de glob.glob et imprimez le résultat. Dans cet exemple, nous sélectionnons tous les fichiers se terminant par _aspect.tif dans le dossier TEAK_Aspect_Tiles . Notez que vous devrez modifier ce chemin de fichier en fonction de votre machine locale.

Afin d'exécuter la fonction gdal_merge, nous avons besoin de ces fichiers sous la forme d'une série de chaînes. Nous pouvons les obtenir dans le bon format en utilisant join :

Maintenant que nous avons la liste des fichiers que nous voulons mosaïquer, nous pouvons exécuter une commande système pour les combiner en un seul raster.

Génial! Il semble que GDAL ait fusionné les fichiers dans le fichier TEAK_Aspect_Mosaic.tif. Il convient de souligner ici que la fonction gdal_merge a BEAUCOUP d'options et est extrêmement puissante et flexible. Nous vous suggérons de lire la documentation de la fonction GDAL ici et d'expérimenter avec vos propres commandes. Cela peut être plus facile à pratiquer d'abord dans la ligne de commande, mais l'intégration de scripts python et de fonctions de ligne de commande ici (comme lors de l'utilisation de la fonction os.system()) est incroyablement utile pour le traitement de grands ensembles de données.

Nous pouvons maintenant définir puis utiliser la fonction raster2array pour lire dans le tableau mosaïqué. Cette fonction convertit le fichier geotif en un tableau et stocke également les métadonnées pertinentes (par exemple, les informations spatiales) dans les métadonnées du dictionnaire . Chargez ou importez cette fonction dans votre cellule avec %load raster2array . Notez que cette fonction nécessite les packages importés au début de ce notebook pour s'exécuter.

Nous pouvons appeler cette fonction de la manière suivante :

Regardez la taille de la tuile mosaïquée à l'aide de .shape . Puisque nous avons créé une mosaïque de quatre tuiles de 1000m x 1000m, nous nous attendons à ce que la nouvelle tuile mesure 2000m x 2000m


Introduction

Le clonage de gènes est habituellement requis pour étudier les fonctions des gènes in vivo et in vitro. Pour la plupart, le gène concerné est ligaturé à un vecteur avec une méthode canonique de coupure et de ligature par enzyme de restriction, ou la nouvelle technique de ligature transparente (Okegawa & Motohashi, 2015). Pour s'assurer que la séquence du gène est correcte dans le plasmide construit, le séquençage de Sanger est utilisé pour séquencer le gène, et les résultats sont alignés et vérifiés (Zimmermann et al., 1988).

Le séquençage Sanger est une technologie de séquençage de l'ADN en incorporant des didésoxynucléotides à terminaison de chaîne, qui sont marqués par fluorescence et peuvent être lus par des machines de séquençage automatisées. Le séquençage de Sanger a été largement appliqué pour déterminer la séquence d'ADN depuis qu'il a été rapporté pour la première fois par Sanger et al. (1977) et Sanger, Nicklen & Coulson (1977). Bien que le séquençage de nouvelle génération ait ouvert une nouvelle ère, le séquençage de Sanger est toujours l'une des méthodes les plus populaires en raison de sa fiabilité, de son prix abordable et de sa faisabilité (Schuster, 2008). Cependant, le nombre de nucléotides déterminé par une réaction de séquençage de Sanger est d'environ 1 000. Pour ces gènes avec des longueurs de seulement plusieurs centaines de nucléotides, il est possible de parcourir chacune des séquences entières avec une seule réaction de séquençage de Sanger, et les résultats peuvent être directement alignés sur les fichiers de gènes corrects. Cependant, dans d'autres cas, les longueurs des gènes dépassent mille nucléotides, au-delà de la portée d'une seule réaction de séquençage de Sanger. Pour obtenir la séquence complète d'un gène cible, il est nécessaire d'effectuer un séquençage ambulant de l'ADN à l'aide d'une nouvelle amorce basée sur le résultat du séquençage précédent. Pour séquencer un grand gène, plusieurs réactions peuvent être nécessaires dans les deux sens avant et arrière. Ces résultats doivent être alignés sur le bon fichier de gènes pour confirmation.

Il est préférable de fusionner tous les résultats de marche avant l'alignement avec le fichier de gènes correct, plutôt que d'aligner séparément chaque résultat de marche avec le fichier de gènes cible (Tang et al., 2020a, 2020b), en particulier pour les grands gènes, qui peuvent être dépassés. 10 000 bps de longueur. Pour fusionner les multiples résultats de marche, plusieurs logiciels commerciaux peuvent être appliqués, tels que DNASTAR (DNASTAR, Inc., Madison, WI, USA), DNAMAN (Lynnon Biosoft, San Ramon, CA, USA), Vector NTI (Thermo Fisher Scientific Inc ., Denver, CO, USA) et SnapGene (GSL Biotech LLC., San Diego, CA, USA), qui sont robustes mais coûteux. Pour la science des protéines et la biologie moléculaire, le séquençage est principalement utilisé pour confirmer si le sous-clonage ou la mutagenèse est correct. De ce fait, certaines fonctions de ces logiciels commerciaux ne sont pas essentielles, et le prix de ces logiciels pourrait être trop élevé pour le travail de routine du clonage moléculaire.

En termes de logiciel libre, il existe un outil en ligne capable de fusionner de longs fragments de séquences qui se chevauchent sur la base de la fusion de programmes dans la suite « EMBOSS » (Bell & Kramvis, 2013 Rice, Longden & Bleasby, 2000). Néanmoins, l'outil Web repose sur l'accès Web et l'état du serveur. "Cap3" est un programme gratuit et efficace pour fusionner des fragments d'ADN, cependant, la ligne de commande est compliquée pour les utilisateurs qui ne sont pas familiarisés avec les commandes de "Cap3" (Huang & Madan, 1999). "Staden", contenant une interface utilisateur graphique, fournit un package gratuit et puissant pour analyser le séquençage du génome géant en combinant le "SPIN" et "EMBOSS" (Staden, Judge & Bonfield, 2003), encore une fois, ce package est compliqué pour certains utilisateurs .

Depuis le premier essai d'assemblage de séquence d'ADN par ordinateur, les algorithmes se sont développés rapidement, que l'on peut classer en trois classes : la première est la méthode de chevauchement-disposition-consensus (Batzoglou, 2005), qui applique un graphe de chevauchement la seconde est de Bruijn graph roads (Idury & Waterman, 1995 Pevzner, 1989 Pevzner, Tang & Waterman, 2001), qui utilise un graphe k-mer et le dernier est un algorithme glouton, qui utilise un k-mer ou un graphe de chevauchement (Pop, 2009 Pop & Salzberg, 2008). La plupart de ces algorithmes sont codés en C, ce qui est difficile pour les biologistes ayant moins d'expérience en programmation.

Ici, nous introduisons un script Python capable de fusionner plusieurs fichiers de séquençage Sanger qui se chevauchent en utilisant le module d'alignement de Biopython (Cock et al., 2009). Pour visualiser les paramètres critiques du processus de fusion, nous imprimons la sortie de l'alignement et montrons la jonction critique dans la séquence fusionnée. Le script est utile pour fusionner les séquences Sanger et augmenter l'efficacité du sous-clonage.


1. Introduction

La cartographie est l'une des questions les plus fondamentales et les plus difficiles en robotique, et a attiré de plus en plus l'attention depuis les travaux fondateurs présentés dans Smith87. Au cours des dernières décennies, de nombreuses approches efficaces Thrun05 ont été proposées pour créer plusieurs types de cartes d'environnement, telles que la carte en grille Giorg07 , la carte de caractéristiques John11 , la carte topologique Lui12 et la carte hybride Bibby10 , etc. En tant que sorte de carte probabiliste, la La carte de grille d'occupation n'est pas requise pour extraire des caractéristiques spéciales des environnements, elle peut donc facilement modéliser des types arbitraires d'environnements. Par conséquent, la carte quadrillée est l'une des représentations cartographiques les plus populaires dans la cartographie robotique. Cependant, la plupart des approches de cartographie robotique ne peuvent créer qu'une seule carte pour les environnements à moyenne échelle. Pour l'environnement à grande échelle, les multi-robots doivent explorer en coopération différentes parties du même environnement afin de créer une carte en grille avec une bonne efficacité et précision. Le problème clé est de savoir comment intégrer ces cartes de grille locales construites par plusieurs robots dans une seule carte globale.

Pour fusionner une paire de cartes quadrillées, Carpin et a l . l'a considéré comme le problème d'optimisation Carpin05 , où la transformation optimale doit être recherchée pour aligner deux cartes de grille à fusionner. Par la suite, deux approches de recherche stochastique ont été proposées pour résoudre ce problème d'optimisation Carpin05 Carpin06 . De même, Li e t a l .

a proposé une approche de fusion de cartes en grille basée sur l'algorithme génétique

Li14. Bien que ces approches puissent obtenir la transformation rigide optimale, elles prennent toutes du temps en raison de la nature de la recherche exhaustive. Contrairement à ces approches de fusion passive, certains chercheurs ont proposé que lorsque deux robots se rencontrent au hasard ou se recherchent pendant la cartographie, ils peuvent effectuer la fusion de cartes en déterminant leur pose relative Howard06 Fox06 . De plus, Carpin e t a l . puis proposé une approche de fusion de cartes basée sur la transformée de Hough Carpin08

, qui peut fusionner des cartes de grille contenant les entités linéaires. Bien que cette approche puisse fusionner efficacement la carte quadrillée sans aucune extraction de caractéristiques linéaires, sa précision devrait être encore améliorée en raison de la nature de l'erreur de discrétisation dans la transformée de Hough. En outre, il est nécessaire que les cartes quadrillées potentiellement fusionnées contiennent un pourcentage de chevauchement significatif. Pour résoudre le problème de précision, Zhu

e t a l . Zhu13 considérait la fusion de la carte quadrillée comme le problème d'enregistrement de l'ensemble de points et l'a accompli par le point le plus proche itératif coupé (TrICP) Chet05 Phils07, où les paramètres initiaux sont fournis par l'approche de fusion de carte basée sur la transformation de Hough. Pendant ce temps, Blanco e t a l . a proposé une méthode multi-hypothèses pour fournir les paramètres initiaux de l'algorithme d'enregistrement d'ensembles de points afin de fusionner les cartes de grille Blanco13. Par la confirmation des hypothèses de fusion, il peut obtenir le résultat de fusion robuste. Pour résoudre le problème de robustesse, Saeedi e t a l . a proposé l'approche améliorée de fusion de cartes en grille basée sur la transformation de Hough, qui peut fusionner une paire de cartes en grille même avec un faible pourcentage de chevauchement Saee14 . Pour fusionner des cartes quadrillées avec différentes résolutions, Ma e t a l . proposent une approche basée sur le recalage d'images Ma16, qui permet de déterminer si l'une des deux cartes doit être minimisée ou agrandie afin d'être fusionnée avec l'autre. Il semble que de nombreuses approches proposées peuvent fusionner des paires de cartes quadrillées avec une bonne précision et efficacité, mais peu d'approches de fusion peuvent vraiment accomplir la fusion simultanée de plusieurs cartes quadrillées.

Supposons qu'il existe un ensemble de cartes de grille non ordonnées, qui sont construites par plusieurs robots explorant différentes parties du même grand environnement. Ces cartes quadrillées ne se chevauchent pas ou se chevauchent partiellement. Compte tenu de la carte de référence, le but de la fusion de plusieurs cartes quadrillées est d'intégrer ces cartes quadrillées locales dans une carte globale en calculant le mouvement global de chaque carte quadrillée vers la carte de référence. Pour résoudre ce problème, de nombreux auteurs ont déclaré que leurs approches de fusion par paires peuvent être directement étendues pour fusionner plusieurs cartes de grille de manière séquentielle. Plus précisément, l'algorithme de fusion par paires peut fusionner à plusieurs reprises deux cartes de grille et les intégrer dans une seule grille jusqu'à ce que toutes les cartes de grille soient intégrées ensemble. Cependant, ce type d'approche souffre du problème d'accumulation d'erreurs. Comme mentionné dans Zhu13 Ma16 , le problème de la fusion de cartes de grille par paires peut être considéré comme le problème d'enregistrement par paires Besl92 Zhu114 . En conséquence, le problème de la fusion de plusieurs cartes en grille peut également être considéré comme un problème d'enregistrement à vues multiples Huber03 Ajmal06 Zhu16 Evang14 Govindu14 Zhu14 Fed16 . Cependant, la plupart des enregistrements multi-vues doivent être fournis avec les bons mouvements initiaux à l'avance Evang14 Govindu14 Zhu14 Fed16 . Sinon, ils sont incapables d'effectuer l'enregistrement multi-vues. En outre, bien que certaines approches existantes puissent réaliser un enregistrement multi-vues sans mouvements initiaux, elles sont conçues pour traiter le balayage de plage 3D et toujours fastidieux Huber03 Ajmal06 Zhu16 . Par conséquent, il est nécessaire de concevoir une approche d'enregistrement multi-vues automatique, qui peut traiter efficacement les cartes en grille 2D. Récemment, l'algorithme de moyenne de mouvement a été introduit comme moyen efficace pour résoudre le problème d'enregistrement multi-vues Govindu04. Bien que cette approche puisse accomplir efficacement l'enregistrement multi-vues, elle doit être fournie avec de bons mouvements globaux initiaux et des résultats d'enregistrement par paire fiables Govindu14 Govindu06 .

Basé sur l'algorithme original de moyennage de mouvement, cet article propose une approche efficace de fusion de cartes en grille, qui peut simultanément fusionner plusieurs cartes en grille sans aucune information préalable. Comme il est difficile de calculer directement les mouvements globaux de ces cartes quadrillées, l'approche proposée réalise la fusion de plusieurs cartes quadrillées en trois étapes. Tout d'abord, la méthode de fusion par paire est présentée pour estimer les mouvements relatifs pour la paire de cartes en grille, qui a un certain pourcentage de chevauchement. Comme l'algorithme de fusion par paire peut être appliqué à certaines paires de cartes en grille, qui ont de faibles pourcentages de chevauchement ou même sans chevauchement, le mouvement relatif estimé peut ne pas être fiable. Par conséquent, toutes les cartes de grille et les mouvements relatifs estimés sont utilisés pour construire un graphe non orienté afin d'échantillonner le sous-graphe connecté maximal (MCS). En confirmant le MCS échantillonné avec tous les mouvements relatifs, il est facile de calculer les mouvements globaux initiaux et d'éliminer tous les mouvements relatifs non fiables. Par la suite, l'algorithme de moyenne de mouvement peut être adopté pour affiner les mouvements globaux initiaux afin d'obtenir des mouvements globaux précis pour fusionner plusieurs cartes de grille. Pour illustrer sa supériorité, l'approche proposée est testée sur des ensembles de données de robots réels.

Ce document est organisé comme suit. Dans la section suivante, le problème de fusion de cartes en grille est exposé et l'algorithme TrICP est brièvement passé en revue. La section 3 propose notre approche pour la fusion simultanée de plusieurs cartes de grille. Dans la section 4, l'approche proposée est testée et évaluée sur trois ensembles de données de robots réels. Enfin, quelques conclusions sont tirées dans la section 5.


  • droite : DataFrame ou série nommée
  • comment :<'gauche', 'droite', 'externe', 'interne'>, par défaut 'interne'
  • au : étiquette ou liste
  • à gauche sur : étiquette ou liste, ou de type tableau
  • right_on : étiquette ou liste, ou de type tableau
  • index_gauche : bool, par défaut Faux
  • index_droit : bool, par défaut Faux
  • sorte : bool, par défaut Faux
  • suffixes : tuple de (str, str), par défaut ('_x', '_y')
  • copie : booléen, valeur par défaut True
  • indicateur : bool ou str, valeur par défaut False
  • valider : str, facultatif

Exemple 1 : Fusion de deux Dataframe avec le même nombre d'éléments :

Production :

Exemple 2 : Fusion de deux Dataframe avec un nombre différent d'éléments :

Production :

Si nous utilisons how = "Outer" , il renvoie tous les éléments dans df1 et df2 mais si la colonne d'élément est nulle, alors sa valeur NaN renvoie.

Production :

Si nous utilisons how = "left" , il renvoie tous les éléments présents dans le DataFrame de gauche.

Production :

Si nous utilisons how = "right" , il renvoie tous les éléments présents dans le bon DataFrame.

Production :

Attention geek ! Renforcez vos fondations avec le Fondation de programmation Python Cours et apprenez les bases.

Pour commencer, vos préparatifs d'entretien Améliorez vos concepts de Structures de Données avec les Python DS Cours. Et pour commencer votre parcours d'apprentissage machine, rejoignez le Cours de niveau de base sur l'apprentissage automatique –


Voici quelques façons de nettoyer le code et de le rendre plus lisible. Cela ne dépasse pas vraiment les fonctionnalités car je ne suis pas très familier avec pexpect ou avec votre autre programme avec lequel vous essayez de vous connecter. Il y a probablement quelques optimisations pour faire la boucle While dans votre programme, en particulier vers la fin où vous changez le lecteur sur lequel vous bouclez, mais comme je ne suis pas familier, je vais laisser cela de côté.

Sans voir le code ou avoir une meilleure compréhension du fonctionnement du vérificateur/joueur, ce sera le meilleur que je puisse donner pour le moment.

Les importations inutilisées ne sont pas une chose terrible, mais ne sont pas vraiment une bonne chose non plus, mieux vaut les supprimer.

Il ne semble pas qu'aucune convention de nommage soit vraiment respectée. Par exemple, vous avez Checker = pexpect.spawn("./checker") mais plus tard vous faites check = Checker.before.strip() . Il est préférable de suivre PEP8 et de s'en tenir à la convention de nommage Snakecase. Ce serait donc checker = pexpect.spawn("./checker")

Les variables nommées de la même manière peuvent être déroutantes. Vous avez Player et player mais ce sont des choses différentes. Mieux vaut être plus précis, player_list et current_player seraient mieux.

Utilisez des littéraux de liste au lieu de créer une liste avec des valeurs arbitraires puis de l'indexer. Vous pouvez réécrire

mais cela regarde un peu en arrière, donc je vais changer toute l'indexation pour que le joueur 1 soit dans l'index 0.

Utilisez la sensation naturelle des booléens au lieu de check != "" où vous auriez dû le faire si check . Python vérifiera None et "" pour vous.


2 réponses 2

Il y a quelques points que je peux peut-être donner pour vous aider.

Tout d'abord, Pandas n'est pas très doué pour fusionner plusieurs grandes trames de données en général, car chaque fois que vous fusionnez une nouvelle trame de données avec une ancienne, il fait une copie des deux pour créer une troisième trame de données - cela commence évidemment à prendre beaucoup de temps car votre Maître dataframe grandit à chaque étape.

Deuxièmement (non testé), vous pouvez essayer de surmonter les goulots d'étranglement de la mémoire lors des étapes de fusion en essayant quelque chose de stupide, comme fusionner deux ou trois fichiers, puis l'écrire sur le disque. Répétez cela jusqu'à ce que vous ayez 30 fichiers CSV plus volumineux, puis recommencez pour avoir, disons, 10 fichiers, et ainsi de suite. Je ne sais pas à quel moment le ramasse-miettes python démarrerait avec votre fonction de réduction unique, il se pourrait donc même que vous commenciez à utiliser la mémoire SWAP, ce qui ralentirait vraiment les choses! Cette solution pourrait au moins empêcher que cela se produise. Vous devez effectuer chaque répétition dans une nouvelle session Python.

Une autre idée, lorsque vous lisez les données à partir de fichiers CSV : vous pouvez utiliser un outil de terminal pour simplement coller tous les fichiers CSV dans un seul fichier, puis les lire dans les pandas une fois que. Effectuez ensuite les actions de nettoyage requises. Le nettoyage peut être pénible (compte tenu de votre fusion sur les exigences, mais vous surmonterez probablement les longs temps d'attente des pandas pour faire les copies. Si vos fichiers sont tous dans un dossier, vous pouvez exécuter ce qui suit dans le terminal pour les mettre tous dans un fichier

Il y a d'autres méthodes ici, au cas où vous devriez omettre la ligne d'en-tête, etc.


Abstrait

Les surfaces B-spline, extraites des données de capteurs numérisées, sont généralement nécessaires pour représenter des objets dans les tâches d'inspection, de topographie, de métrologie et d'ingénierie inverse. Afin d'exprimer un grand objet avec une précision satisfaisante, des balayages multiples, qui conduisent généralement à des patchs qui se chevauchent, sont toujours nécessaires en raison, entre autres, des limitations pratiques et de la précision des mesures, des incertitudes dans les appareils de mesure, des problèmes d'étalonnage ainsi que des compétences de l'expérimentateur. Dans cet article, nous proposons une séquence d'actions consistant en la division et la fusion. Alors que le premier divise une surface B-spline en plusieurs patchs avec les données numérisées correspondantes, le second fusionne les données numérisées et son patch de surface B-spline qui se chevauche. Tout d'abord, tous les cas de chevauchement possibles de deux surfaces B-spline sont énumérés et analysés à partir d'une vue des emplacements des points de projection des quatre coins d'une surface à l'intérieur de sa surface de chevauchement. Ensuite, les méthodes générales de division et de fusion sont développées pour traiter tous les cas de chevauchement, et un exemple simulé est utilisé pour illustrer les procédures détaillées susmentionnées. Dans la suite, deux scans obtenus à partir d'un scanner laser tridimensionnel sont simulés pour exprimer une grande maison avec des surfaces B-spline. Les résultats de la simulation montrent l'efficience et l'efficacité de la méthode proposée. Dans tout ce processus, l'espace de stockage des points de données n'est pas augmenté avec les nouveaux balayages chevauchants obtenus, et aucun des points chevauchants n'est rejeté, ce qui augmente la précision de la représentation. Nous pensons que la méthode proposée a un certain nombre d'applications potentielles dans la représentation et l'expression de grands objets avec des données de scanner laser en trois dimensions.


2 réponses 2

  1. Votre approche est bonne.
  2. Déplacez vos centaines de lignes dans une fonction, puis décomposez cette fonction en morceaux de taille raisonnable. Si c'est toujours énorme et moche, posez cela comme une autre question de révision de code.
  3. Si une erreur autre qu'une IOError se produisait, l'erreur ne serait pas détectée. Cependant, lorsque le bloc with est quitté pour une raison quelconque, input_file et output_file seront correctement fermés.

En plus de ce que @JimDennis a dit, je voudrais souligner qu'il est d'usage d'imprimer des messages d'erreur sur sys.stderr et de quitter avec un état différent de zéro lorsqu'une erreur se produit.

Vous voudrez peut-être passer les noms de fichiers à main() en tant que paramètres, pour promouvoir la réutilisation et les tests de code. Ensuite, dans __main__ : vous pouvez importer sys et vérifier len(sys.argv) > 1 . en définissant les noms de fichiers d'entrée et de sortie.

(Vous pouvez conserver le comportement par défaut dans le cas où votre programme est appelé tel quel, mais ces changements signifieraient également que votre ré-enregistreur CSV pourrait être utilisé comme module pour un autre programme).

En fait, il serait également bon de renommer votre main() actuelle en quelque chose de plus représentatif de sa fonction et d'envelopper la gestion des arguments dans un wrapper main() nouvellement écrit autour de la fonction que vous avez montrée ici.

En généralisant davantage, vous pouvez ajouter un délimiteur = Aucun comme argument par défaut à votre fonction et ainsi faciliter le remplacement des délimiteurs d'entrée et de sortie à l'intérieur de la fonction.

Tout cela dépend de la généralisation et de la réutilisation que vous voulez que votre code soit. De toute évidence, il y a un compromis entre la fonctionnalité flexible et la complexité supplémentaire qui y est introduite.


1 réponse 1

Il n'y a pas de docstrings. A quoi servent ces fonctions ? Quels arguments prennent-ils ? Que retournent-ils ?

Les décorateurs sont normalement nommés d'après le effet qu'ils ont sur la fonction décorée. Par exemple, @functools.lru_cache ajoute un cache LRU à une fonction @unittest.skip provoque le saut d'un scénario de test, et ainsi de suite.

L'effet de @from_iterable est qu'il convertit les arguments en un tuple et passe ce tuple en tant qu'argument unique à la fonction d'origine. Je n'aurais pas deviné cette fonctionnalité à partir du nom, en fait j'aurais deviné l'inverse (qu'il convertirait un seul argument itérable en arguments individuels).

Il a été établi dans les commentaires que l'intention de ce décorateur est de transformer une fonction en une paire de fonctions comme chain et chain.from_iterable (où la fonction d'origine devient disponible sous ce dernier nom, et la nouvelle fonction sous l'ancien nom).

Le problème, c'est que la chaîne était une erreur. Si nous n'avions que chain.from_iterable , alors nous n'aurions pas besoin de chain , car nous pourrions simplement créer un tuple : nous écririons chain.from_iterable((arg1, arg2, . )) au lieu de chain(arg1, arg2, . ) . C'est une modification triviale de la convention d'appel (juste deux parenthèses) qui n'a pas besoin d'une autre fonction pour la prendre en charge. (Par exemple, il serait ridicule d'avoir trié et trié.from_iterable .)

Les développeurs Python étaient contraints par la rétrocompatibilité de laisser la chaîne seule, et donc la seule chose qu'ils pouvaient faire était d'ajouter une autre fonction. Je ne pense pas qu'ils aient voulu que ce soit un modèle à suivre (il n'est certainement utilisé nulle part ailleurs dans la bibliothèque standard). À ce jour, les programmeurs Python à la recherche d'une fonction « flatten » sont surpris de constater qu'elle existe déjà dans la bibliothèque standard sous un nom obscur.

Notez que le code dans le message n'utilise pas réellement merge , il utilise uniquement merge.from_iterable . Donc, la chose évidente à faire serait d'écrire merge de sorte qu'il prenne un itérable, et d'éviter le besoin du décorateur @from_iterable et sa confusion associée.

Étant donné que headA et headB ne sont pas utilisés indépendamment l'un de l'autre, vous pouvez modifier la convention d'appel pour MergeLists afin qu'elle prenne un nombre arbitraire de listes chaînées, comme ceci :

Ou si vous préférez la compréhension, envisagez d'améliorer le nom de la variable de boucle. Le nom i est conventionnellement utilisé pour un indice, mais ici, nous n'itérons pas sur des index, mais sur des valeurs, donc v ou valeur serait plus clair.

Le code dans merge n'utilise pas la fonction intégrée id , il n'est donc pas nécessaire de réécrire la variable en tant que id_ afin d'éviter de masquer la fonction intégrée.

La fonction de fusion maintient deux structures de données. La source du dictionnaire mappe un identifiant de source à un itérateur sur la source correspondante, et les valeurs du dictionnaire mappent un identifiant de source à la valeur au début de la source correspondante. Le code serait simplifié si les deux structures de données étaient combinées en une seule, comme ceci :

Le goulot d'étranglement à l'exécution est l'appel à min pour trouver l'entrée avec la plus petite valeur. Cela prend un temps proportionnel au nombre d'itérables restants, c'est-à-dire $O(l)$.

Nous pouvons améliorer cela en $O(log l)$ si nous gardons les entrées dans un tas, en utilisant le module heapq :


Voir la vidéo: Python opas - tilastotiede - luottamusvälit