2012-06-11 10 views
7

Tengo una matriz 2D numpy char (de un archivo NetCDF4) que en realidad representa una lista de cadenas. Quiero convertirlo en una lista de cadenas.numpy array of chars to string

Sé que puedo utilizar join() para concatenar los caracteres en una cadena, pero sólo puedo encontrar una manera de hacer esto una cuerda a la vez:

data = np.array([['a','b'],['c','d']]) 
for row in data[:]: 
    print ''.join(row) 

pero es muy lento. ¿Cómo puedo devolver una matriz de cadenas en un solo comando? Gracias

+3

¿Por qué está copiando 'data' en su bucle for? –

Respuesta

3

Tratar una lista de comprensión:

>> s = [''.join(row) for row in data] 
>> s 
['ab', 'cd'] 

que está a su bucle for reescrito.

+1

+1. Otra alternativa es 'map (''. Join, data)'. –

+0

@DavidRobinson No había pensado en eso, muy agradable. – Chris

+0

excelentes respuestas. ¡muchas gracias! – AdrianR

11

La lista de comprensión es la forma más "pitónica".

La forma más "numpythonic" sería:

>>> data = np.array([['a','b'],['c','d']]) 
# a 2D view 
>>> data.view('S2') 
array([['ab'], 
     ['cd']], 
     dtype='|S2') 
# or maybe a 1D view ...fastest solution: 
>>> data.view('S2').ravel() 
array(['ab', 'cd'], 
     dtype='|S2') 

Sin loop, sin comprensión de lista, ni siquiera una copia. El búfer se queda allí sin cambios con una "vista" diferente, por lo que esta es la solución más rápida disponible.

+1

Una advertencia importante es que la matriz debe estar * contigua * en la memoria; de lo contrario, la vista falla. Puedes asegurarte usando 'data = np.ascontiguousarray (data)'. – shoyer