2013-06-04 6 views
3

h5py를 사용하여 개별 H5 파일에 저장할 많은 양의 데이터를 수집 중입니다. 이 이미지를 하나의 이미지로 저장하기 위해 하나의 pcolormesh 플롯으로 패치하고 싶습니다.Python으로 H5 파일에 저장된 매우 큰 데이터 세트에서 pcolormesh 이미지 생성

빠른 예제에서는 2000x2000 임의 데이터 점의 배열을 생성하고 h5py를 사용하여 H5 파일에 저장합니다. 그런 다음이 파일의 데이터를 가져 와서 matplotlib에 pcolormesh로 그려 넣으려고합니다.하지만 항상 memoryError (예상)가 실행됩니다.

import numpy 
import h5py 
arr = numpy.random.random((2000,2000)) 

with h5py.File("TEST_HDF5_SAVE_FILES\\Plot_0.h5", "w") as f: 
    dset = f.create_dataset("Plot_0", data = arr) 

for i in range(1,100): 
    arr = numpy.random.random((2000,2000)) 
    with h5py.File("TEST_HDF5_SAVE_FILES\\Plot_" + str(i) + ".h5", "w") as f: 
     dset = f.create_dataset("Plot_" + str(i), data = arr) 

이 스크립트는 내 파일을 생성합니다. 나는 임의의 수로 100을 골라서 충분히 큰 파일 세트를 가져왔다.

그때 나는 그들이 다음 스크립트를 사용하여 가져옵니다

for 루프에서 범위 값은 100까지 변경,하지만 메모리 오류없이 선택할 수있는 최대 값 (즉 5 5 할 수
y = numpy.arange(0, 2000, 1) 

for display_plot_num in range(0, 5): 
    print display_plot_num 
    x = numpy.arange(display_plot_num*2000, display_plot_num*2000 + 2000, 1) 

    with h5py.File("TEST_HDF5_SAVE_FILES\\Plot_" + str(display_plot_num) + ".h5", "r+") as f: 
     data = f["Plot_" + str(display_plot_num)] 
     plt.pcolormesh(x, y, data) 
plt.show() 

플롯은 matplotlib의 pcolormesh 플롯에서 패치 될 수 있습니다.) 매우 지저분하고 느립니다. 많은 이미지를 함께 패치 할 수 있어야합니다.

이 데이터를 플롯하기 위해 사용해야하는 다른 기술이 있습니까? 또는 matplotlib이나 scipy와 같은 유사한 프로그램을 거치지 않고 여러 H5 파일의 데이터를 이미지로 변환 할 수 있다면 좋을 것입니다. 나는 하나의 이미지로 함께 이러한 파일을 패치하고을 저장해야

  • 내가 이미지 데이터 HDF5의 많은 수의 파일 (2000x2000)
  • 이 : 요약

    , 내 문제는 이것이다

도움을 주시면 감사하겠습니다. 또한, 나는 내 문제에 대한 더 이상의 질문에 대답하게되어 기쁘다.


편집 (2013년 5월 6일는) :

나는 비슷한 질문이 파이썬에서 매우 높은 해상도의 이미지 (수입, 조작, 편집 등)을 처리하는 방법이 될 것이라고 생각합니다. 이것은 본질적으로 내가하려는 일입니다. 작은 이미지 모음에서 매우 높은 해상도의 이미지를 생성합니다.

+2

'pcshormesh' 대신에'interpolation = "none"으로'imshow'를 사용해보십시오. 이미지의 위치를 ​​지정하는 방법을 변경해야합니다 (예 : x 및 y를 전달하는 대신 'extent' kwarg 사용). 그러나 더 빨라야합니다. –

+1

샘플을 다운시킬 수 있습니까? – tacaswell

+0

어떤 dtype이 데이터입니까? 덜 정밀도로 벗어날 수 있습니까? 나는 당신의 눈이 float32와 float64 (또는 int16)의 차이점을 말할 수 있을지 의심하지 않는다. – matt

답변

0

matplotlib에서 이미지의 팽창을 줄이는 한 가지 방법은 (특히 SVG에 저장하는 경우) rasterized=True kwarg를 사용하는 것입니다. 이것은 본질적으로 당신의 pcolormesh를 "평평하게"할 것이고, 저장하는 것이 훨씬 빨라지고, 자원을 덜 사용하게됩니다.