2015-09-18 12 views
7

Mam tablicę 2-d numpy ciągów. Czy istnieje sposób łączenia łańcuchów w każdym wierszu, a następnie łączenia łańcuchów wynikowych za pomocą ciągu separatora, np. nowa linia?Łączyć tablicę ciągów numpy wzdłuż osi?

Przykład:

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

chcę uzyskać:

"Hello\nWorld\n" 
+0

jest ostatecznym '\ n'' ważny? Zwykłe użycie 'join' umieszcza separator między łańcuchami, ale nie na końcu. – hpaulj

+0

Nie ma znaczenia - zawsze mogę dodać go później. – ErikR

Odpowiedz

7

To nie jest trudne do zrobienia poza z 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' 

Istnieje również moduł np.core.defchararray który ma "gadżety" do pracy z tablicami znaków - jednak stwierdza, że ​​są to po prostu wrappery wokół wbudowanego w pythona i standardowych funkcji biblioteki, więc prawdopodobnie nie otrzymasz żadnego prawdziwego przyspieszenia przez ich użycie.

2

Jednym ze sposobów byłoby użyć str.join() i listowych, przykład -

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' 

Jeśli naprawdę potrzebują \n na końcu, można łączyć je po dołączeniu th strun. Przykład:

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

Miałeś odpowiednie pomysły. Oto vectorized NumPythonic realizacja próbuje przejść wzdłuż tych pomysłów -

# 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() 

Albo jedno-liner z np.column_stack -

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

run Sample -

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

To jest bardzo interesujące. – ErikR

+0

@ user5402 Yeah! Nie oczekiwałem, że otrzymam rozwiązanie czysto numpythoniczne, ale ostatecznie się udało! :) – Divakar

+0

To jest interesujące. Jestem trochę zbyt leniwy, aby to wypróbować, ale zastanawiam się, jak poręcze można porównać do innych (nie numnych) rozwiązań. – mgilson

Powiązane problemy