Pytables值错误(附加对象的等级与“ ...” EArray不同)

时间:2018-12-03 04:22:54

标签: arrays python-3.x numpy pytables

我正在尝试使用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。当我使用im分配X大小时,怎么可能呢?我什至尝试打印im的形状,它给出(278,278,1)。那么,有什么问题呢?我是第一次使用Pytables,所以请不要深入了解它们。

2 个答案:

答案 0 :(得分:0)

首先,请注意,在加载第一个图像数据集之前不必创建EArray。 Pytables很聪明,可以从第一个对象确定原子和形状定义。
没有完整的示例和数据,我很难练习您的代码。因此,我创建了一个非常简单的示例,该示例使用np.arange()创建了两个(278,278)图像数组,然后在2和0方向上进行扩展。希望这可以模拟您要加载到EArray的数据。 2个Pytables函数(file.create_earrayearray.append)创建2行数据,每个“图像” 1行。运行后,使用HDFView打开image_data1.h5并检查数据。
也许这可以帮助您了解如何将图像加载到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()

答案 1 :(得分:0)

使用更复杂的写入方法和一个EArray.read示例添加第二个答案。坦白说,我更喜欢我的更简单的方法(上面)来创建定义了obj=的EArray,并让Pytables处理数据结构。但是,如果您希望自己进行管理,请参见下面的示例2。注意的关键项目:

  • 原子定义具有4个维度,其中0轴设置为零(定义
    的方向。)
  • im = np.expand_dims(im,0)完成,直到在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])