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

Pytables Value Error (rank of the appended object and "..."EArray differ)

我正在尝试使用 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,对它们了解不深

首先,请注意您不必在加载第一个图像数据集之前创建 EArray。 Pytables 足够聪明,可以从第一个对象确定原子和形状定义。
如果没有完整的示例和您的数据,我很难练习您的代码。因此,我创建了一个非常简单的示例,该示例使用 np.arange() 创建一对 (278,278) 图像数组,然后在 2 和 0 方向上扩展它们。希望这模拟了您尝试加载到 EArray 的数据。 2 个 Pytables 函数(file.create_earrayearray.append)创建 2 行数据,每个 "image" 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()

使用更复杂的写入方法和 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])