Arrays Pytables值错误(附加对象的秩与“array”不同)
我正在尝试使用pytables存储我的图像数据集。我使用耳环在读取图像时附加每个图像。我的耳环和图像的尺寸是相同的(除了第一个,沿着它进行附加)。我正在使用以下代码:Arrays Pytables值错误(附加对象的秩与“array”不同),arrays,python-3.x,numpy,pytables,Arrays,Python 3.x,Numpy,Pytables,我正在尝试使用pytables存储我的图像数据集。我使用耳环在读取图像时附加每个图像。我的耳环和图像的尺寸是相同的(除了第一个,沿着它进行附加)。我正在使用以下代码: 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.exp
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
atom=atom.from_dtype(np.dtype(np.uint32,(278278,1)))
i=0
用于:
im=cv2.imread(img.path,0)
im=np。展开_dims(im,2)#这是因为keras需要3d图像,而灰度图像是2d
如果不是,我:
X=数据。创建数组(数据组,“X”,原子,(0,)+im.shape,chunkshape=(20,20,20,1))
X.append(np.expand_dims(im,0))#因为追加需要相同的dim。
i=1
但当我运行代码时,它仍然给出了我的value错误,表示我的对象秩为1,X秩为4。当我使用im分配X尺寸时,这是怎么可能的。我甚至试着打印im的形状,它给出(278278,1)。那么,问题是什么?我是第一次使用Pytables,所以不太了解它们。首先,请注意,在加载第一个图像数据集之前,不必创建耳环。Pytables足够智能,可以从第一个对象确定原子和形状定义。
如果没有完整的示例和数据,我很难使用您的代码。因此,我创建了一个非常简单的示例,它使用
np.arange()
创建了两个(278278)
图像数组,然后在2和0方向上扩展它们。希望这能模拟您试图加载到Array的数据。2个Pytables函数(file.create_array
和array.append
)创建2行数据,每个“图像”1行。运行后,用HDFView打开image_data1.h5
,检查数据。也许这将帮助您了解如何将图像加载到HDF5耳环:
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()
首先,请注意,在加载第一个图像数据集之前,不必创建耳环。Pytables足够智能,可以从第一个对象确定原子和形状定义。
如果没有完整的示例和数据,我很难使用您的代码。因此,我创建了一个非常简单的示例,它使用
np.arange()
创建了两个(278278)
图像数组,然后在2和0方向上扩展它们。希望这能模拟您试图加载到Array的数据。2个Pytables函数(file.create_array
和array.append
)创建2行数据,每个“图像”1行。运行后,用HDFView打开image_data1.h5
,检查数据。也许这将帮助您了解如何将图像加载到HDF5耳环:
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()
使用更复杂的写入方法添加第二个答案,再加上
array.read
示例。坦白地说,我更喜欢我的简单方法(如上所述)创建定义了obj=
的array,并让Pytables处理数据结构。但是,如果您更愿意自己管理,请参见下面的示例2。需要注意的关键事项:
- 原子定义有4个维度,0轴设置为零(定义
将延伸的方向)
完成,直到在 创建时耳环形状的定义im=np.expand_dims(im,0)
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()
以下是从Array X读取数据所需的行(使用两条print
语句验证角落中的值)。只要耳环的味道是Numpy(在我的示例中就是这样),这就应该有效。您还可以使用out=
参数指定一个NumPy数组来接收输出数据。还有其他方法可以访问array数据,包括.iterrows()
进行迭代,以及\uuuu getitem\uuuuuu()
使用奇特的索引进行切片。如果要执行这些操作,请阅读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])
使用更复杂的写入方法添加第二个答案,再加上
array.read
示例。坦白地说,我更喜欢我的简单方法(如上所述)创建定义了obj=
的array,并让Pytables处理数据结构。但是,如果您更愿意自己管理,请参见下面的示例2。需要注意的关键事项:
- 原子定义有4个维度,0轴设置为零(定义
将延伸的方向)
完成,直到在 创建时耳环形状的定义im=np.expand_dims(im,0)
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()
以下是从Array X读取数据所需的行(使用两条print
语句验证角落中的值)。只要耳环的味道是Numpy(在我的示例中就是这样),这就应该有效。您还可以使用out=
参数指定一个NumPy数组来接收输出数据。还有其他方法可以访问array数据,包括.iterrows()
进行迭代,以及\uuuu getitem\uuuuuu()
使用奇特的索引进行切片。如果要执行这些操作,请阅读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])
这是可行的,但我的代码没有什么问题。你能告诉我如何从耳环上取回numpy阵列吗。当我读取该文件时,它返回一个array对象,该对象在传递到matplotlib时为图像错误提供了无效的维度。@Shantanu Shinde,您的代码中有很多东西。当做复杂的事情时,从简单开始,增加复杂性。您的
数据.create_array()
调用定义了原子、形状和块大小。然后附加图像数据。当你这样做的时候,所有这些都必须是一致的。而且,在创建耳环时,需要将Atom实例的一个维度设置为零。(来自pytables的错误消息!)。有关编码的详细信息,请参见下面的第二个答案,以及array.read()
示例。这很管用,但没有发现我的代码有什么问题。你能告诉我如何从耳环上取回numpy阵列吗。当我读文件时,它是r