2015-09-18 19 views
7

Ho una matrice numerica di stringhe 2-d. Esiste un modo per concatenare le stringhe in ogni riga e quindi unire le stringhe risultanti con una stringa separatrice, ad es. una newline?concatena array di stringhe numpy lungo un asse?

Esempio:

pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

voglio ottenere:

"Hello\nWorld\n" 
+0

è la finale '\ n'' importante? Il solito uso di 'join' mette il separatore tra le stringhe, ma non alla fine. – hpaulj

+0

Non è importante - posso sempre aggiungerlo in seguito. – ErikR

risposta

7

Non è difficile da fare di fuori di NumPy:

>>> import numpy as np 
>>> pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 
>>> pic 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 
>>> '\n'.join([''.join(row) for row in pic]) 
'Hello\nWorld' 

C'è anche il modulo np.core.defchararray che ha "chicche" per lavorare con gli array di caratteri - Tuttavia, afferma che si tratta semplicemente di wrapper attorno alle funzioni builtin di Python e alle librerie standard, quindi probabilmente non otterrete alcuna accelerazione reale usandoli.

2

Un modo potrebbe essere quello di utilizzare str.join() e di lista, ad esempio -

In [1]: import numpy as np 

In [2]: pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

In [3]: pic 
Out[3]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='<U1') 

In [4]: '\n'.join([''.join(x) for x in pic]) 
Out[4]: 'Hello\nWorld' 

Se si ha realmente bisogno la \n alla fine, è possibile concatenare che dopo l'adesione esimo stringhe. Esempio -

In [5]: '\n'.join([''.join(x) for x in pic]) + '\n' 
Out[5]: 'Hello\nWorld\n' 
7

Hai avuto le idee giuste lì. Ecco un'implementazione vectorized NumPythonic cercando di andare avanti quelle idee -

# Create a separator string of the same rows as input array 
separator_str = np.repeat(['\n'], pic.shape[0])[:,None] 

# Concatenate these two and convert to string for final output 
out = np.concatenate((pic,separator_str),axis=1).tostring() 

O un one-liner con np.column_stack -

np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 

Campione run -

In [123]: pic 
Out[123]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 

In [124]: np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 
Out[124]: 'Hello\nWorld\n' 
+0

Questo è molto interessante. – ErikR

+0

@ user5402 Sì! Non mi aspettavo di avere una soluzione puramente numpythonic, ma alla fine ha funzionato! :) – Divakar

+0

È interessante. Sono un po 'troppo pigro per provarlo, ma mi chiedo come i tempi si possano confrontare con le altre soluzioni (non numpiche). – mgilson

Problemi correlati