2012-06-16 3 views
2

크기가 [frame, x, y] 인 픽셀 강도의 큰 3 차원 배열로 구성된 일부 이미징 데이터를 분석합니다. 이들은 보통 메모리에 보관하기에는 너무 크기 때문에 PyTables 배열로 하드 디스크에 상주합니다.PyTables : 큰 배열의 여러 차원 인덱싱

내가 할 수 있기를 원하는 것은 모든 프레임에서 픽셀의 임의의 하위 집합의 강도를 읽는 것입니다.

import numpy as np 
import tables 

tmph5 = tables.open_file('temp.hdf5', 'w') 
bigarray = tmph5.create_array('/', 'bigarray', np.random.randn(1000, 200, 100)) 

roipixels = [[0, 1, 2, 4, 6], [34, 35, 36, 40, 41]] 
roidata = bigarray[:, roipixels[0], roipixels[1]] 
# IndexError: Only one selection list is allowed 

불행하게도이 PyTables는 현재 목록 인덱스의 단일 세트를 지원하는 것 :이 작업을 수행하는 자연적인 방법은 목록 색인 것 같다. 추가 문제는 목록 색인에 중복을 포함 할 수 없다는 것입니다. 픽셀 x 좌표의 내 목록에 [1, 1]이 포함되어 있기 때문에 픽셀 [1, 2][1, 3]을 동시에 읽을 수 없습니다.

roidata = np.asarray([row[roipixels[0], roipixels[1]] for row in bigarray]) 

하지만, 이러한 반복적 인 내가 처리하고있어 프레임의 많은 수에 매우 느려질 수 읽기 : 나는 배열의 행을 반복 할 수 있음을 알고있다.

더 좋은 방법이 있나요? 필자는 PyTables에 비교적 익숙하지 않기 때문에 큰 배열에서 데이터 집합을 구성하는 것에 대한 조언이 있으면 그 파일을 듣고 싶습니다.

+0

내가 그 사실 HDF5의 기본 제한보다는 pytables 제한 생각 (I가 완전히 잘못 될 수 있습니다. ..). 여하튼,'h5py'는 테이블이 아닌 데이터에 더 자연 스럽다. 그러나이 경우에도 동일한 제한이 있습니다. –

답변

2

무엇이든지간에, 나는 종종 hdf 형식으로 저장된 3D 지진 데이터를 사용하여 동일한 작업을 수행합니다.

중첩 루프로 인해 반복 읽기 속도가 느립니다. (각 행을 반복하지 않고) 단일 루프 만 수행하면 상당히 빠릅니다 (적어도 h5py을 사용하는 경우, 일반적으로 pytables을 사용하여 테이블과 같은 데이터 만 저장함).

대부분의 경우, 각 행보다 표시 목록을 반복하는 것이 좋습니다.

는 기본적으로, 당신이 원하는 :

대신
roidata = np.vstack([bigarray[:,i,j] for i,j in zip(*roipixels)]) 

:

roidata = np.asarray([row[roipixels[0],roipixels[1]] for row in bigarray]) 

를이 크게 도움이 될 것입니다 저장된 배열의 chunksize 영역을 조정, 가장 일반적인 사용 사례의 경우. 당신은 길고 좁은 덩어리를 원할 것입니다, 당신의 경우, 첫 번째 축을 따라 가장 긴 길이를가집니다.

(경고 :. 내가 pytables 이것을 테스트하지 않은,하지만이 h5py와 함께 완벽하게 작동)

+0

고마워, 조. 나는 그 종류의 대답을 내 질문에 맞춰 봤지만, 나는 당신의 제안 된 라인이 실제로 나의 경우에는 (약 15 배) 느리게 읽는다는 것을 발견 한 것에 놀랐다. 이것이 Pytables 대 h5py 문제인지 또는 그것이 청크 모양 또는 압축과 관련이 있는지 여부는 확실하지 않습니다. 나는 h5py를 점검하고 더 잘 수행되는지 확인합니다. –

+0

아마 배열이 저장되어있는 chunksize에 의해 제어됩니다. 원본 hdf 파일이 행별로 액세스하도록 최적화되어 있으면 행 기반 액세스가 더 빠릅니다. pytables가 chunkksize를 계산하는 방법을 알지 못합니다. 어쨌든 행운을 비네! –