2012-06-11 14 views
7

Ho un array di caratteri numerici 2D (da un file NetCDF4) che rappresenta effettivamente un elenco di stringhe. Voglio convertirlo in una lista di stringhe.array numpy di caratteri nella stringa

So che posso utilizzare join() per concatenare i caratteri in una stringa, ma posso solo trovare un modo per fare questo una corda alla volta:

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

ma è molto lento. Come posso restituire un array di stringhe in un singolo comando? Grazie

+3

Perché si copia 'data' nel proprio ciclo? –

risposta

3

Prova una lista di comprensione:

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

, che è solo il tuo for ciclo riscritto.

+1

+1. Un'altra alternativa è 'map (''. Join, data)'. –

+0

@DavidRobinson Non ci aveva pensato - molto bello. – Chris

+0

grandi risposte. grazie molto! – AdrianR

11

La comprensione della lista è il modo più "poderoso".

Il modo più "numpythonic" sarebbe:

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

No looping, nessuna lista di comprensione, nemmeno una copia. Il buffer rimane invariato con una "vista" diversa, quindi questa è la soluzione più veloce disponibile.

+1

Un avvertimento importante è che l'array deve essere * contiguo * in memoria, altrimenti la visualizzazione fallisce. Puoi assicurarlo usando 'data = np.ascontiguousarray (data)'. – shoyer

Problemi correlati