python arrays string numpy

Python numpy array de cadenas arbitrarias de longitud



arrays string (2)

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

Cuando intento esto, cada elemento solo almacena un solo 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


Puede 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 cadenas de pitón:

>>> 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 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 tan rápido porque funciona en grandes bloques contiguos de memoria en bruto. Trabajar con objetos Python agrega mucha sobrecarga. Un simple ejemplo:

>>> 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


Puede 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)