Как в python 3.6 получить массив данных из файла hdf5, если dtype равен " - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу получить набор данных в формате {N, 16, 512, 128} в виде массива 4D numpy из файла hdf5. N - количество трехмерных массивов в формате {16, 512, 128}. Я пытаюсь сделать это:

import os
import sys
import h5py as h5
import numpy as np
import subprocess
import re

file_name = sys.argv[1]
path = sys.argv[2]

f = h5.File(file_name, 'r')
data = f[path]
print(data.shape) #{27270, 16, 512, 128}
print(data.dtype) #"<u4"

data = np.array(data, dtype=np.uint32)
print(data.shape)

К сожалению, после команды data = np.array(data, dtype=np.uint32) кажется, что код завис, потому что ничего не произошло после.

Мне нужно получить этот набор данных в виде массива numpy или, может быть, что-то похожее для дальнейших расчетов. Если у вас есть предложения, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Оказывается, вам даже не нужно менять форму. Вот пример доступа к набору данных, затем нарезки для получения массива. Я думаю, что это именно то, что вы хотите.

Редактировать 30 апреля-2020
ОП был в отношении uint32. Мой первоначальный ответ использовал массив с плавающей точкой. Это продемонстрировало желаемое поведение. Для полноты я внес небольшую модификацию, чтобы создать набор данных из целочисленного массива uint32.
Примечание. Я использовал a0=100. Файл HDF5, который он создает, составляет 840 МБ для чисел с плавающей запятой и 416 МБ для uint32. Умножьте это на 273 для a0=27270. У меня почти нет оперативной памяти, чтобы создать это за один выстрел. Код ниже показывает процесс.

(Примечание. Набор данных был создан с maxshape=None для оси = 0, чтобы разрешить расширение. Если вы заинтересованы в тестировании больших наборов данных, вы можете изменить этот пример, добавив al oop, чтобы создать больше данных и добавьте в конец набора данных.)

import numpy as np
import h5py

a0 = 27270
a0 = 100
a1= 16
a2 = 512
a3 = 128

f_arr = np.random.rand(a0*a1*a2*a3).reshape(a0, a1, a2, a3)
i_arr = np.random.randint(0,254, (a0, a1, a2, a3), dtype=np.uint32 )

with h5py.File('SO_61508870.h5', mode='w') as h5w:
     h5f.create_dataset('array1', data=i_arr, maxshape=(None, a1, a2, a3) )

with h5py.File('SO_61508870.h5', mode='r') as h5r:
     data_ds = h5r['array1']
     print ('dataset shape:', data_ds.shape)
     for i in range(5):
         sliced_arr = data_ds[i,:,:,:]
         print ('array shape:', sliced_arr.shape)
0 голосов
/ 29 апреля 2020

У меня нет проблем с записью / извлечением <u4 и np.uint32:

In [14]: import h5py                                                                                   
In [15]: f=h5py.File('u4.h5','w')                                                                      
In [16]: ds = f.create_dataset('data', dtype='<u4', shape=(10,))                                       
In [17]: ds                                                                                            
Out[17]: <HDF5 dataset "data": shape (10,), type "<u4">
In [18]: ds[:]                                                                                         
Out[18]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint32)
In [19]: ds[:] = np.arange(-5,5)                                                                       
In [20]: ds                                                                                            
Out[20]: <HDF5 dataset "data": shape (10,), type "<u4">
In [21]: ds[:]                                                                                         
Out[21]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4], dtype=uint32)
In [22]: np.array(ds, dtype='uint32')                                                                  
Out[22]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4], dtype=uint32)
In [23]: f.close()     

Возможно, вы превысили лимит памяти. Я получаю сообщение об ошибке памяти при попытке создать массив такого размера:

In [24]: np.zeros((27270, 16, 512, 128),np.uint32);                                                    
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-24-2cfe704044b6> in <module>
----> 1 np.zeros((27270, 16, 512, 128),np.uint32);

MemoryError: Unable to allocate 107. GiB for an array with shape (27270, 16, 512, 128) and data type uint32

Вы все еще можете загрузить фрагмент data, например data[0:100].

...