ValueError: Saving saving in appending mode in Pytables
ValueError: Saving saving in appending mode in Pytables
我有 100 张图像,每张图像 85*85 size
(width*height
),由 numpy 数组 (data
) 给出,如下所示。
import numpy as np
import tables as tb
data = np.random.rand(100, 85, 85)
print (data.shape)
我想把每一张图片都以追加的方式一张一张保存到一个h5文件中
fo = "data.h5"
h5 = tb.open_file(fo, mode='w')
group = h5.create_group(h5.root, 'data')
atom = tb.Float64Atom()
ds = h5.create_earray(group, 'test', atom,
(0, data.shape[1], data.shape[2]))
for ix in range(data.shape[0]):
dd = data[ix, :, :]
ds.append(dd)
ds.flush()
ds.close()
但是,我收到以下错误:
ValueError:附加对象 (2) 和 /data/test
EArray (3) 的等级不同
访问 data
数组元素时请注意语法。当您使用 dd = data[ix, :, :]
时,dd.shape=(85, 85)
您需要 dd = data[ix:ix+1, :, :]
才能获得第 1 行。
如果您必须附加很多行,则逐行加载数据效率不高。最好将它们放在一个数组中并附加整个数组。这显示在 ds2.append(data)
的创建中
这是更新的解决方案。请注意,我更喜欢 with/as
打开文件以进行更清晰的文件错误处理。
with tb.open_file(fo, mode='w') as h5:
group = h5.create_group(h5.root, 'data')
atom = tb.Float64Atom()
ds = h5.create_earray(group, 'test', atom,
(0, data.shape[1], data.shape[2]))
for ix in range(data.shape[0]):
dd = data[ix:ix+1, :, :]
print (dd.shape)
ds.append(dd)
# Method to create Earray with parent groups,
# then append all image data at one time
ds2 = h5.create_earray('/data2', 'test2', atom,
(0, data.shape[1], data.shape[2]),
createparents=True)
ds2.append(data)
如果您想加载 1 个 Earray 中的所有数据,使用引用您的数组的 obj=data
参数加载很简单。这保留了在维度 0 中可扩展的形状定义。请参阅下面的修改代码。
h5 = tb.open_file(fo, mode='w')
group = h5.create_group(h5.root, 'data')
ds = h5.create_earray('/data', 'test', atom,
(0, data.shape[1], data.shape[2]),
obj=data)
ds.flush() # not necessary
ds.close() # not necessary
h5.close() ## REQUIRED!!!!
我有 100 张图像,每张图像 85*85 size
(width*height
),由 numpy 数组 (data
) 给出,如下所示。
import numpy as np
import tables as tb
data = np.random.rand(100, 85, 85)
print (data.shape)
我想把每一张图片都以追加的方式一张一张保存到一个h5文件中
fo = "data.h5"
h5 = tb.open_file(fo, mode='w')
group = h5.create_group(h5.root, 'data')
atom = tb.Float64Atom()
ds = h5.create_earray(group, 'test', atom,
(0, data.shape[1], data.shape[2]))
for ix in range(data.shape[0]):
dd = data[ix, :, :]
ds.append(dd)
ds.flush()
ds.close()
但是,我收到以下错误:
ValueError:附加对象 (2) 和 /data/test
EArray (3) 的等级不同
访问 data
数组元素时请注意语法。当您使用 dd = data[ix, :, :]
时,dd.shape=(85, 85)
您需要 dd = data[ix:ix+1, :, :]
才能获得第 1 行。
如果您必须附加很多行,则逐行加载数据效率不高。最好将它们放在一个数组中并附加整个数组。这显示在 ds2.append(data)
这是更新的解决方案。请注意,我更喜欢 with/as
打开文件以进行更清晰的文件错误处理。
with tb.open_file(fo, mode='w') as h5:
group = h5.create_group(h5.root, 'data')
atom = tb.Float64Atom()
ds = h5.create_earray(group, 'test', atom,
(0, data.shape[1], data.shape[2]))
for ix in range(data.shape[0]):
dd = data[ix:ix+1, :, :]
print (dd.shape)
ds.append(dd)
# Method to create Earray with parent groups,
# then append all image data at one time
ds2 = h5.create_earray('/data2', 'test2', atom,
(0, data.shape[1], data.shape[2]),
createparents=True)
ds2.append(data)
如果您想加载 1 个 Earray 中的所有数据,使用引用您的数组的 obj=data
参数加载很简单。这保留了在维度 0 中可扩展的形状定义。请参阅下面的修改代码。
h5 = tb.open_file(fo, mode='w')
group = h5.create_group(h5.root, 'data')
ds = h5.create_earray('/data', 'test', atom,
(0, data.shape[1], data.shape[2]),
obj=data)
ds.flush() # not necessary
ds.close() # not necessary
h5.close() ## REQUIRED!!!!