Bonjour à tous,
dans le cadre d'un projet, je dois lire un fichier qui contient des entiers (un entier par ligne) et stocker ces entiers dans un « tableau ». Le plus naturel m'a paru être de les stocker dans des objets lists fournis avec python.
Cependant, la personne qui m'encadre sur ce projet me demande d'utiliser des ndarray du module numpy (la dimension de la liste étant de 1, c'est plutôt un 1darray donc).
Après avoir modifié mon programme pour qu'il passe fasse usage des numpy.array, il est beaucoup plus lent, ce que j'ai imputé au fait que je n'ai pas trouvé, comme pour les listes, de méthode append qui ajouterait un élément à la fin de mon array, mais seulement la fonction append qui retourne un array contenant la nouvelle valeur à la fin, et que j'affecte alors de nouveau à mon objet. Cette manière de faire me paraît tout à fait contre-productive, puisqu'au lieu d'un simple append(), je dois faire une affectation à chaque fois.
J'ai alors pensé, à partir de mon fichier, à créer une liste, puis une fois créée (tous les append() réalisés) en faire un numpy.array. C'est mieux, mais toujours 2 à 3 fois plus long (sur mon test) que ma méthode initiale sans numpy.
Malgré mes recherches, je n'ai rien trouvé dans numpy qui permette un ajout "en place" dans un array. Quelqu'un saurait-il si cela existe, ou s'il y a une meilleure méthode?
J'aimerais également un avis quant à la pertinence de l'utilisation de numpy ici, sachant que dans la suite du projet (je ne suis qu'au début), les objets manipulés seront des graphes (n'ayant pas vraiment de connaissances dans ce domaine, je ne sais sous quelle forme ils seront stockés). Que peut donc m'apporter numpy dans de telles circonstances?
Merci d'avance
# La réponse est dans les docstrings :)
Posté par Jean B . Évalué à 3.
Provides
1. An array object of arbitrary homogeneous items
2. Fast mathematical operations over arrays
3. Linear Algebra, Fourier Transforms, Random Number Generation
ndarray(shape, dtype=float, buffer=None, offset=0,
strides=None, order=None)
An array object represents a multidimensional, homogeneous array
of fixed-size items. An associated data-type object
describes the format of each element in the array (its byte-order,
how many bytes it occupies in memory, whether it is an integer or
a floating point number, etc.).
Donc en gros tu ne trouvera pas de méthode append car ce n'est pas une liste mais un tableau (un peu comme en C). Tu doit donc déterminer la taille de ce tableau avant de l'instancier.
En gros ça doit donner ça:
f= open('txt')
lines = f.readlines()
f.close()
my_array = ndarray(len(lines))
for index, line in enumerate(lines):
my_array[index] = int(line)
Tu peut encore améliorer cet algo en déterminant le nombre d'élément sans lire l'intégralité du fichier (en comptant les retours chariots, puis en lisant les lignes une a une ensuite par exemple).
Bon courage !
[^] # Re: La réponse est dans les docstrings :)
Posté par vermillon . Évalué à 1.
Mon temps d'exécution pour un même test est toutefois de 80% supérieur à ma référence avec des listes. Je pense donc que je vais laisser tomber numpy (on me l'a en quelque sorte imposé, mais comme il s'agit de faire du prototypage rapide avec python, je ne vois pas l'intérêt de perdre du temps à m'y adapter si finalement c'est pour recoder en C ou C++ ensuite).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.