2012-06-11 3 views
7

실제로 문자열 목록을 나타내는 2D numpy char 배열 (NetCDF4 파일에서)이 있습니다. 그것을 문자열 목록으로 변환하고 싶습니다.numpy 문자열 배열에 문자 배열

은 내가 문자열로 문자를 연결하는()에 가입 사용할 수 있습니다 알고 있지만, 나는 한 번에이 하나의 문자열을 할 수있는 방법을 찾을 수 있습니다

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

을하지만 매우 느리다. 단일 명령으로 문자열 배열을 반환하려면 어떻게해야합니까?

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

당신의 for 루프를 다시 작성 : 감사

+3

왜 for 루프에 '데이터'를 복사하고 있습니까? –

답변

3

는 지능형리스트를 사용해보십시오.

+1

+1. 또 다른 대안은'map (''. join, data)'입니다. –

+0

@DavidRobinson 그 생각을하지 못했습니다. 아주 좋습니다. – Chris

+0

좋은 답변입니다. 많은 감사합니다! – AdrianR

11

목록의 이해는 가장 "불쾌한"방법입니다.

가장 "numpythonic"방법은 없을 것입니다 :

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

없음 루프, 아니 지능형리스트, 심지어 사본. 버퍼는 다른 "보기"로 변경되지 않고 그대로 유지되므로 가장 빠른 솔루션입니다.

+1

중요한주의 사항은 배열이 메모리에서 * 연속적이어야한다는 것입니다. 그렇지 않으면 뷰가 실패합니다. 'data = np.ascontiguousarray (data)'를 사용하여 이것을 보장 할 수있다. – shoyer