97 votes

Comment créer un tableau numpy de chaînes de longueur arbitraire ?

Je suis complètement novice en Python, mais il semble qu'une chaîne de caractères donnée puisse avoir une longueur (effectivement) arbitraire, c'est-à-dire que l'on peut prendre un fichier string str et continuer à en rajouter : str += "some stuff..." . Existe-t-il un moyen de créer un tableau de ces chaînes ?

Lorsque j'essaie ceci, chaque élément ne stocke qu'un seul caractère.

strArr = numpy.empty(10, dtype='string')
for i in range(0,10)
    strArr[i] = "test"

D'un autre côté, je sais que je peux initialiser un tableau de chaînes de longueur déterminée, c'est-à-dire

strArr = numpy.empty(10, dtype='s256')

qui peut stocker 10 chaînes de caractères jusqu'à 256.

139voto

senderle Points 41607

Vous pouvez le faire en créant un tableau de dtype=object . Si vous essayez d'assigner une longue chaîne à un tableau numpy normal, il tronque la chaîne :

>>> a = numpy.array(['apples', 'foobar', 'cowboy'])
>>> a[2] = 'bananas'
>>> a
array(['apples', 'foobar', 'banana'], 
      dtype='|S6')

Mais lorsque vous utilisez dtype=object vous obtenez un tableau de références d'objets python. Ainsi, vous pouvez avoir tous les comportements des chaînes de caractères python :

>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object)
>>> a
array([apples, foobar, cowboy], dtype=object)
>>> a[2] = 'bananas'
>>> a
array([apples, foobar, bananas], dtype=object)

En effet, comme il s'agit d'un tableau d'objets, vous pouvez assigner tout type d'objet python dans le tableau :

>>> a[2] = {1:2, 3:4}
>>> a
array([apples, foobar, {1: 2, 3: 4}], dtype=object)

Cependant, cela annule une grande partie des avantages de l'utilisation de numpy, qui est si rapide parce qu'il travaille sur de grands blocs contigus de mémoire brute. Travailler avec des objets python ajoute beaucoup de surcharge. Un exemple simple :

>>> a = numpy.array(['abba' for _ in range(10000)])
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object)
>>> %timeit a.copy()
100000 loops, best of 3: 2.51 us per loop
>>> %timeit b.copy()
10000 loops, best of 3: 48.4 us per loop

22voto

jterrace Points 21939

Vous pouvez utiliser le type de données objet :

>>> import numpy
>>> s = numpy.array(['a', 'b', 'dude'], dtype='object')
>>> s[0] += 'bcdef'
>>> s
array([abcdef, b, dude], dtype=object)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X