2012-07-16 2 views
4

작년에 numpy에서 구문 분석/데이터 누적을 수행하여 작성한 이진 파일 파서의 속도를 높이려고합니다. 사용자 정의 된 데이터 구조를 정의하고 이진 파일의 데이터를 그 안에 넣는 numpy의 기능은 "비표준"길이 (예 : 6 바이트)의 부호없는 정수입니다. 파이썬 2.7을 사용하기 때문에이 필드를 처리하기 위해 int.from_bytes 에뮬레이트 된 버전을 만들었지 만 이러한 필드를 기본적으로 numpy로 정수로 읽는 방법이 있다면 분명 훨씬 빠르고 바람직합니다.파일에서 임의의 바이트 길이 정수를 읽고 저장하는 중

답변

4

Numpy는 임의 길이 정수를 지원하지 않으며 ctypes 비트 필드를 사용하면 가치가있는 것보다 문제가 많습니다.

내가했던 다음-높은 표준 크기의 정수로 데이터를 변환하는 벡터화 슬라이싱을 사용하는 것이 좋습니다 :

buf = "000000111111222222" 
a = np.ndarray(len(buf), np.dtype('>i1'), buf) 
e = np.zeros(len(buf)/6, np.dtype('>i8')) 
for i in range(3): 
    e.view(dtype='>i2')[i + 1::4] = a.view(dtype='>i2')[i::3] 
[hex(x) for x in e] 
+0

내가 같은 유형으로 호출하지 않는 한 ndarray.view를 호출 할 때 나는 ValueErrors와 점점 계속 그것은으로 창조되었다. 이것을 피하기위한 규칙은 무엇입니까? – dpitch40

+1

@ dpitch40 ndarray.view를 사용하여 배열의 별명을 지정하는 것이 좋습니다. 귀하의 numpy 버전에 문제가 될 수 있습니다. arr.data를 사용하여 기본 버퍼와 함께 ndarray 생성자를 사용할 수도 있습니다. – ecatmur

관련 문제