2012-06-11 20 views
7

Mam tablicę 2D numpy char (z pliku NetCDF4), która faktycznie reprezentuje listę ciągów. Chcę przekonwertować go na listę ciągów.numpy tablica znaków do łańcucha

wiem, że mogę używać join(), aby złączyć znaków w ciąg, ale mogę tylko znaleźć sposób, by zrobić ten jeden ciąg naraz:

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

Ale to jest bardzo powolny. Jak mogę zwrócić tablicę łańcuchów w jednym poleceniu? Dzięki

+3

Dlaczego kopiujesz 'dane' w swojej pętli for? –

Odpowiedz

3

Spróbuj listowych:

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

który jest tylko pętla for przepisany.

+1

+1. Inną alternatywą jest 'map (''. Join, data)'. –

+0

@DavidRobinson Nie pomyślał o tym - bardzo miły. – Chris

+0

świetne odpowiedzi. Wielkie dzięki! – AdrianR

11

Zrozumienie listy jest najbardziej "pythonic" sposób.

Najbardziej "numpythonic" sposób byłoby:

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

Nie pętli, nie lista zrozumienie, nawet kopię. Bufor znajduje się w niezmienionej postaci z innym "widokiem", więc jest to najszybsze dostępne rozwiązanie.

+1

Ważne jest to, że tablica musi być * ciągła * w pamięci - w przeciwnym razie widok się nie powiedzie. Możesz to zapewnić, używając 'data = np.ascontiguousarray (data)'. – shoyer