Ошибка значения Pytables (ранг добавленного объекта и "..." EArray отличаются) - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь использовать pytables для хранения набора данных изображений.Я использую Earray, чтобы добавить каждое изображение, как оно читается.Размеры моего Earray и изображения одинаковы (кроме первого, по которому выполняется добавление).Я использую следующий код:

atom = Atom.from_dtype(np.dtype(np.uint32,(278,278,1)))
i=0
for <read each image from folder using os into img>:
    im = cv2.imread(img.path,0)
    im = np.expand_dims(im,2) #this is because keras needs 3d images and grayscale images are 2d
    if not i:
        X = data.create_earray(dataGroup,"X",atom,(0,)+im.shape,chunkshape=(20,20,20,1))
   X.append(np.expand_dims(im,0)) #as appending require same dim.
   i=1

Но все же, когда я запускаю код, он дает моему ValueError сообщение о том, что мой ранг объекта равен 1, а ранг X равен 4. Как это возможно, когда я присваиваю Xразмер с помощью им.Я даже попытался напечатать форму им, это дает (278,278,1).Так в чем проблема?Я использую Pytables впервые, поэтому не знаю их подробно.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Добавление второго ответа с более сложным методом записи плюс пример 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])
0 голосов
/ 03 декабря 2018

Во-первых, обратите внимание, что вам не нужно создавать EArray перед загрузкой первого набора данных изображения.Pytables достаточно умен, чтобы определять атом и форму по первому объекту.
Мне было трудно использовать ваш код без полного примера и ваших данных.Итак, я создал очень простой пример, который использует np.arange() для создания пары (278,278) массивов изображений, а затем расширяет их в направлениях 2 и 0.Надеюсь, это имитирует данные, которые вы пытаетесь загрузить в EArray.2 функции Pytables (file.create_earray и earray.append) создают 2 строки данных, по 1 на каждое «изображение».После запуска откройте image_data1.h5 с HDFView и проверьте данные.
Может быть, это поможет вам понять, как загрузить ваши изображения в HDF5 Earrays:

import tables as tb, numpy as np
data = tb.open_file("image_data1.h5", mode='w')
dataGroup = data.create_group(data.root, 'MyData')

im = np.arange(278*278).reshape((278,278))
im = np.expand_dims(im,2)
im = np.expand_dims(im,0)

X = data.create_earray( dataGroup,"X",obj=im )

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()
...