2017-02-23 5 views
0

float 배열 (21600, 43200)을 포함하는 netcdf 파일이 있습니다. 너무 커서 RAM에 전체 배열을 읽고 싶지 않습니다. 따라서 Dataset 개체를 netCDF4 라이브러리에서 사용하여 배열을 읽었습니다.좌표 집합을 사용하여 매우 큰 ncdf를 신속하게 서브 세트해야합니다.

300-400 좌표의 2 개의 1D numpy 배열 (x_coords, y_coords)을 사용하여이 배열의 부분 집합 평균을 계산하고 싶습니다.

기본 색인 생성을 사용할 수 없다고 생각합니다. 좌표가 연속적이 아니기 때문입니다. 내가 현재 단지 개체에 직접 배열을 먹이과 같이됩니다하고 있어요 ~ 내가 사용 좌표에 따라 3-4초을

ncdf_data = Dataset(file, 'r') 
mean = np.mean(ncdf_data.variables['q'][x_coords, y_coords]) 

위의 코드 내 마음에 드는 (위해 너무 오래 걸립니다), 나는 이것을 어떻게 든 속도를 올리고 싶습니다. 고급 인덱싱을 트리거하지 않고도 이러한 하위 집합의 평균을 직접 계산할 때 사용할 수있는 비유적인 방법이 있습니까? 내가 h5py 공상 색인의 느린 속도에 대해 경고 알고

답변

0

docs.h5py.org/en/latest/high/dataset.html#fancy-indexing. 

netCDF의 아마 같은 문제가 있습니다.

모든 값을 포함하는 인접한 슬라이스를로드하고 해당 하위 집합에 더 빠른 numpy 고급 인덱싱을 적용 할 수 있습니까? 또는 청크로 작업해야 할 수도 있습니다.

numpy 고급 인덱싱은 기본 슬라이스보다 느리지 만 파일에서 직접 인덱싱하는 것보다 훨씬 빠릅니다.

그러나 수행하면 np.mean은 파일의 데이터가 아닌 메모리의 데이터에서 작동합니다. 고급 인덱싱의 속도가 느린 이유는 파일을 통해 흩어져있는 데이터에 액세스해야하기 때문입니다. 메모리의 배열에 데이터를로드하는 것이 느린 부분이 아닙니다. 느린 부분은 파일을 찾고 읽는 것입니다.

더 빠른 드라이브 (예 : 솔리드 스테이트 드라이브)에 파일을 넣으면 도움이 될 수 있습니다.

+0

작은 덩어리를 메모리로 읽은 다음 그 위에 내 목록을 적용 해보겠습니다. 조언 해주셔서 감사합니다! –