Добавление второго ответа с более сложным методом записи плюс пример EArray.read
.Честно говоря, я предпочитаю, чтобы мой более простой метод (выше) создавал EArray с определением obj=
и позволял Pytables обрабатывать структуры данных.Однако, если вы предпочитаете управлять этим самостоятельно, см. Пример 2 (ниже).Ключевые элементы, на которые следует обратить внимание:
- Определение атома имеет 4 измерения, с осью 0, установленной на ноль (определяет
направление, которое будет расширено). im = np.expand_dims(im,0)
сделанопока AFTER im.shape
не будет указан в определении фигуры EArray при создании.
[ОБНОВЛЕННЫЙ КОД НИЖЕ]
import tables as tb, numpy as np
data = tb.open_file("image_data1.h5", mode='w')
dataGroup = data.create_group(data.root, 'MyData')
MyAtom = tb.Atom.from_dtype(np.dtype(np.uint32,(0,278,278,1)))
im = np.arange(278*278).reshape((278,278))
im = np.expand_dims(im,2)
X = data.create_earray(dataGroup,"X", MyAtom, (0,)+im.shape)
im = np.expand_dims(im,0)
X.append( im )
print ('flavor =', X.flavor )
print ('dim=', X.ndim, ', rows = ', X.nrows)
im = np.arange(278*278,278*278+278*278).reshape((278,278))
im = np.expand_dims(im,2)
im = np.expand_dims(im,0)
X.append( im )
print ('dim=', X.ndim, ', rows = ', X.nrows)
data.close()
Вот строки, необходимые для чтения данныхиз EArray X (с парой операторов print
для проверки значений в углах).Это должно работать, пока в EArray используется Numpy (как в моем примере).Вы также можете использовать параметр out=
, чтобы указать массив NumPy для получения выходных данных.Существуют и другие методы доступа к данным EArray, в том числе .iterrows()
для итерации и .__getitem__()
для нарезки с причудливой индексацией.Прочтите документацию по Pytables, если хотите сделать что-либо из этого.
Y_1 = X.read( 0 )
print (Y_1[0,0,0])
print (Y_1[-1,-1,-1])
Y_2 = X.read( 1 )
print (Y_2[0,0,0])
print (Y_2[-1,-1,-1])