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)