2012-02-28 81 views
12

Decir que tengo la siguiente matriz:¿Cómo creo matrices de caracteres en numpy?

import numpy as np 
a = ['hello','snake','plate'] 

quiero que esto se convierta en una matriz numpy b de modo que:

b[0,0] = 'h' 
b[0,1] = 'e' 
b[0,2] = 'l' 
b[1,0] = 's' 
... 

Quiero que los trucos numpy estándar para trabajar, como la radiodifusión, la comparación, etc.

¿Cómo se hace? ¿Y dónde está esto en la documentación numpy?

Gracias!

Uri

Respuesta

7

Usted puede crear una matriz de caracteres numpy directamente ej .:

b = np.array([ ['h','e','l','l','o'],['s','n','a','k','e'],['p','l','a','t','e'] ]) 

Los trucos conjunto usual trabajar con esto.

Si tiene a y desea generar b de ella, tenga en cuenta que:

list('hello') == ['h','e','l','l','o'] 

para que pueda hacer algo como:

b = np.array([ list(word) for word in a ]) 

Sin embargo, si a tiene palabras de desigualdad longitud (por ejemplo, ['snakes','on','a','plane']), ¿qué quieres hacer con las palabras más cortas? Usted podría almohadilla con espacios a la palabra más larga:

wid = max(len(w) for w in a) 
b = np.array([ list(w.center(wid)) for w in a]) 

cual el string.center(width) almohadillas con espacios, centrando la cadena. También puede usar rjust o ljust (consulte string docs).

+0

Gracias, esto probablemente funcione para mí. Pero me pregunto si hay alguna manera en la que no tenga que usar la lista de comprensión. Voy a tener que realizar esta operación muchas veces (con arreglos más grandes para arrancar). ¿Hay un solo comando numpy que lo haga con los bucles en el código compilado? –

+0

No conozco ningún comando numpy que específicamente divida cadenas en letras individuales mientras se fuerza a una matriz. Creo que puedes estar atascado con listas de comprensión (pero veremos, tal vez alguien conoce una función mágica que hace esto). –

17

En realidad, puede hacer esto sin copias o listas de comprensión en numpy (salvedades sobre cadenas de igual longitud a un lado ...). Sólo verlo como una matriz de cadenas de caracteres 1 y remodelarlo:

import numpy as np 

x = np.array(['hello','snake','plate'], dtype=str) 
y = x.view('S1').reshape((x.size, -1)) 

print repr(y) 

Esto produce:

array([['h', 'e', 'l', 'l', 'o'], 
     ['s', 'n', 'a', 'k', 'e'], 
     ['p', 'l', 'a', 't', 'e']], 
     dtype='|S1') 

En términos generales, sin embargo, me gustaría evitar el uso de matrices numpy para almacenar cadenas en la mayoría de los casos. Hay casos en los que es útil, pero por lo general es mejor que se apegue a las estructuras de datos que permiten cadenas de longitud variable, por ejemplo, que contienen cadenas.

+1

para python3 necesita escribir dtype = bytes si la cadena es una cadena de caracteres – jcr

+0

Si desea que las cadenas Unicode funcionen, cambie dtype = np.unicode_ y vea ('U1') – ybull