¿Cómo crear una matriz numpy de cadenas de longitud arbitraria?

Soy un novato completo de Python, pero parece que una cadena dada puede ser (efectivamente) de longitud arbitraria. es decir, puede tomar una string str y seguir agregándola: str += "some stuff..." . ¿Hay una manera de hacer una serie de tales cadenas?

Cuando bash esto, cada elemento solo almacena un único carácter.

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

Por otro lado, sé que puedo inicializar una matriz de ciertas cadenas de longitud, es decir,

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

que puede almacenar 10 cadenas de hasta 256 caracteres.

Puedes hacerlo creando una matriz de dtype=object . Si intenta asignar una cadena larga a una matriz numpy normal, trunca la cadena:

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

Pero cuando usa dtype=object , obtiene una matriz de referencias de objetos de Python. Para que pueda tener todos los comportamientos de las cadenas de 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) 

De hecho, debido a que es una matriz de objetos, puede asignar cualquier tipo de objeto de Python a la matriz:

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

Sin embargo, esto deshace muchos de los beneficios de usar numpy, que es muy rápido porque funciona en grandes bloques contiguos de memoria en bruto. Trabajar con objetos de Python agrega mucha sobrecarga. Un ejemplo 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 

Podrías usar el tipo de datos del objeto:

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