web-dev-qa-db-fra.com

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

Je suis un débutant en Python, mais il semble qu'une chaîne donnée puisse être (effectivement) de longueur arbitraire. c'est-à-dire que vous pouvez prendre un string str et continue d’ajouter: str += "some stuff...". Y at-il un moyen de faire un tableau de ces chaînes?

Quand j'essaye cela, 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'autre part, je sais que je peux initialiser un tableau de certaines chaînes de longueur, c'est-à-dire.

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

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

54
DilithiumMatrix

Vous pouvez le faire en créant un tableau de dtype=object. Si vous essayez d'affecter 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 quand vous utilisez dtype=object _, vous obtenez un tableau de python références à des objets. Ainsi, vous pouvez avoir tous les comportements de python chaînes:

>>> 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 affecter un objet any à python) au tableau:

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

Cependant, cela annule de nombreux avantages liés à l'utilisation de numpy, qui est très rapide car il fonctionne sur de grands blocs de mémoire brute contigus. Travailler avec des objets python ajoute beaucoup de travail supplémentaire. 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
93
senderle

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)
12
jterrace