2012-03-31 29 views
18

cercare di convertire gli array int a matrici di stringhe in NumPyConversione array int ad array di stringhe in NumPy senza troncamento

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

Non quello che ho inteso

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

Questo funziona, ma ho dovuto sapere 10 è stato abbastanza grande da contenere la mia corda più lunga. C'è un modo per farlo facilmente senza sapere in anticipo quale stringa di dimensioni hai bisogno? Sembra un po 'pericoloso che tronca tranquillamente la stringa senza generare un errore.

+0

Per i visitatori dal 2018 e oltre: 'a.astype (str)' ora funzionerà esattamente come desiderato. – Raketenolli

risposta

30

Ancora una volta, questo può essere risolto in puro Python:

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

Oppure, se avete bisogno di convertire avanti e indietro:

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

Grazie. Credo di aver bisogno di conoscere meglio la mappa. – Dave31415

2

È possibile trovare la più piccola larghezza sufficiente in questo modo:

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

In alternativa, è sufficiente creare il ndarray da un elenco di stringhe:

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

Per array di grandi dimensioni 'map()' è un'opzione migliore di una list comprehension perché spinge l'esecuzione del codice in C. –

+1

@JoelCornett A volte 'map' può essere leggermente più veloce (in questo esempio è circa il 3% più veloce di usando una lista di comprensione per me), ma questo non è sempre il caso, e la comprensione delle liste è considerata più pitonica. Vedi http://stackoverflow.com/a/1247490/1191119 – jorgeca

+2

@jorgeca: Assolutamente, non è sempre il caso. Per inciso, mentre stavo facendo la ricerca, mi sono imbattuto in [questo articolo illuminante] (http://www.python.org/doc/essays/list2str.html) di Guido. –

28

Si può soggiornare in NumPy, facendo

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

Questo è due volte più veloce rispetto map o list comprehension per 10 elementi, quattro volte più veloce per 100. Questa e altre operazioni su stringa sono documentate here.

+0

Fresco, ma non riesco a trovare la documentazione per questo, potresti fornire un link se possibile? –

+0

@MikhailV Certo, ho appena aggiunto un link alla risposta. – jorgeca

0

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

Esempio

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