2012-02-02 5 views
15

미리 문자열의 길이를 알지 못하고 문자열을 저장할 numpy 재 배열을 초기화 할 수 있습니까? A (인위적인) 예를 들어가변 길이 numpy 재 배열 문자열

:

mydf = np.empty((numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ]) 

문제는 내가 정보를 채우는 사전에 내 recarray를 구성하고있어 것입니다, 나는 반드시 사전에 file_name의 최대 길이를 모른다 .

내 모든 시도는 잘리지 문자열 필드에 결과 :

>>> mydf = np.empty((2,), dtype=[('file_name',str),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
     dtype=[('file_name', 'S'), ('file_size_mb', '<f8')]) 
>>> mydf['file_name'] 
array(['f', 'a'], 
     dtype='|S1') 

(여담으로 mydf['file_name'] 쇼 'F'와 'A'동안 mydf 쇼 ''과 ''않는 이유?)

I가 유형 (말) |S10로 초기화 경우

마찬가지로, file_name 다음 물건의 길이는 10

내가 찾을 수있는 유일한 비슷한 질문이 this one입니다

하지만,이 calcu에서 잘립니다 적절한 문자열 길이가 이고 선험적으로이므로 (사전에 아무것도 알지 못했기 때문에) 내 것과 완전히 같지 않습니다.

(예 : |S9999999999999)을 초기화하는 것 외에 다른 대안이 있습니까? (즉, 어리석은 상한선)?

+0

이것은 좋은 질문입니다. 재 배열의 길이 0 문자열은 30 분 동안 머리를 찢어 버렸습니다. – Christoph

답변

24

STRING dtype을 사용하는 대신 항상 object을 dtype으로 사용할 수 있습니다. 그러면 모든 객체가 파이썬 가변 길이 문자열을 포함하여 배열 요소에 할당됩니다. 예를 들어

>>> import numpy as np 
>>> mydf = np.empty((2,), dtype=[('file_name',object),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
     dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')]) 

그것은 어레이 개념의 사상에 대해 가변 길이 요소를 가지고 있지만 이는 하나 얻을 수 가깝다. 배열의 아이디어는 요소가 가변 길이 요소를 금지하는 잘 정의되고 규칙적인 메모리 주소에 메모리에 저장된다는 것입니다. 문자열에 대한 포인터를 배열에 저장하면이 제한을 피할 수 있습니다. (이것은 위의 예제가 기본적으로하는 것입니다.)

+0

그 덕분에 - 난 그냥 R 언어에서 이동하고 기본적으로 개체의 데이터 프레임 종류를 원했고,이 위대한 작품! –

+3

Late comment : R에서 이동하는 경우 pandas.DataFrame 객체를 고려하십시오.이 객체는 사용자에게 익숙해 보이고 문자열을 잘 처리해야합니다. – mdurant