2012-03-31 8 views
18

tratar de convertir matrices INT para las matrices de cadenas en numpyconversión de matrices INT para las matrices de cadenas en numpy sin truncamiento

In [66]: a=array([0,33,4444522]) 
In [67]: a.astype(str) 
Out[67]: 
array(['0', '3', '4'], 
     dtype='|S1') 

No es lo que pretende

In [68]: a.astype('S10') 
Out[68]: 
array(['0', '33', '4444522'], 
     dtype='|S10') 

Esto funciona, pero tenía que saber 10 era lo suficientemente grande como para contener mi cadena más larga. ¿Hay alguna forma de hacerlo fácilmente sin saber de antemano qué tamaño de cadena necesita? Parece un poco peligroso que simplemente trunca la cuerda sin lanzar un error.

+0

Para los visitantes de 2018 y más allá: 'a.astype (str)' ahora funcionará exactamente como se desea. – Raketenolli

Respuesta

30

Una vez más, esto puede ser resuelto en Python puro:

>>> map(str, [0,33,4444522]) 
['0', '33', '4444522'] 

O si es necesario convertir de ida y vuelta:

>>> a = np.array([0,33,4444522]) 
>>> np.array(map(str, a)) 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Gracias. Creo que necesito familiarizarme más con el mapa. – Dave31415

2

Usted puede encontrar la suficiente anchura más pequeña de este modo:

In [3]: max(len(str(x)) for x in [0,33,4444522]) 
Out[3]: 7 

Como alternativa, simplemente construya el ndarray de una lista de cadenas:

In [7]: np.array([str(x) for x in [0,33,4444522]]) 
Out[7]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 

o, usando map():

In [8]: np.array(map(str, [0,33,4444522])) 
Out[8]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Para arreglos grandes, 'map()' es una mejor opción que una lista de comprensión porque empuja la ejecución del código en C. –

+1

@JoelCornett A veces 'map' puede ser ligeramente más rápido (en este ejemplo es aproximadamente 3% más rápido que usando una lista de comprensión para mí), pero este no es siempre el caso, y las listas de comprensión se consideran más pitónicas. Ver http://stackoverflow.com/a/1247490/1191119 – jorgeca

+2

@jorgeca: Absolutamente, no siempre es el caso. Incidentalmente, mientras hacía la investigación, me encontré con [este artículo esclarecedor] (http://www.python.org/doc/essays/list2str.html) escrito por Guido. –

28

Puede permanecer en numpy, haciendo

np.char.mod('%d', a) 

Ésta es dos veces más rápido que map o listas por comprensión por 10 elementos, cuatro veces más rápido para 100. Esta y otras operaciones de cadena están documentadas here.

+0

Genial, pero no puedo encontrar documentación para esto, ¿podrías proporcionar un enlace si es posible? –

+0

@MikhailV Claro, acaba de agregar un enlace a la respuesta. – jorgeca

0

np.apply_along_axis(lambda y: [str(i) for i in y], 0, x)

Ejemplo

>>> import numpy as np 

>>> x = np.array([-1]*10+[0]*10+[1]*10) 
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

>>> np.apply_along_axis(lambda y: [str(i) for i in y], 0, x).tolist() 
['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', 
'1', '1', '1', '1'] 
Cuestiones relacionadas