h5py 将虚拟数据集读入 NumPy 数组时出错
h5py error reading virtual dataset into NumPy array
我正在尝试从使用 h5py 创建的虚拟 HDF 数据集加载数据,但在正确加载数据时遇到了一些问题。
这是我的问题的一个例子:
import h5py
import tools as ut
virtual = h5py.File(ut.params.paths.virtual)
a = virtual['part2/index'][:]
print(virtual['part2/index'][-1])
print(a[-1])
这输出:
[890176134]
[0]
为什么?为什么我将数据复制到 NumPy 数组 (value=[0]
) 与直接从数据集中读取 (value=[890176134]
) 时最后一个元素不同?
我是不是在没有意识到的情况下做错了什么?
非常感谢。
是的,您应该从虚拟数据集或从虚拟数据集创建的数组中获取相同的值。如果没有有关数据的更多详细信息,则很难诊断错误。
我使用 h5py 示例 vds_simple.py
来演示它的行为方式。大多数代码构建 HDF5 文件。最后的部分比较输出。下面的代码修改自示例以创建可变数量的源文件(由 a0=
定义)。
使用示例数据创建 'a0' 源文件的代码:
a0 = 5000
# create sample data
data = np.arange(0, 100).reshape(1, 100)
# Create source files (0.h5 to a0.h5)
for n in range(a0):
with h5py.File(f"{n}.h5", "w") as f:
row_data = data + n
f.create_dataset("data", data=row_data)
定义虚拟布局和assemble虚拟数据集的代码:
# Assemble virtual dataset
layout = h5py.VirtualLayout(shape=(a0, 100), dtype="i4")
for n in range(a0):
filename = "{}.h5".format(n)
vsource = h5py.VirtualSource(filename, "data", shape=(100,))
layout[n] = vsource
# Add virtual dataset to output file
with h5py.File("VDS.h5", "w", libver="latest") as f:
f.create_virtual_dataset("vdata", layout)
读取和打印数据的代码:
# read data back
# virtual dataset is transparent for reader!
with h5py.File("VDS.h5", "r") as f:
arr = f["vdata"][:]
print("\nFirst 10 Elements in First Row:")
print("Virtual dataset:")
print(f["vdata"][0, :10])
print("Reading vdata into Array:")
print(arr[0, :10])
print("Last 10 Elements of Last Row:")
print("Virtual dataset:")
print(f["vdata"][-1,-10:])
print("Reading vdata into Array:")
print(arr[-1,-10:])
上面代码的输出(w/a0=5000):
First 10 Elements in First Row:
Virtual dataset:
[0 1 2 3 4 5 6 7 8 9]
Reading vdata into Array:
[0 1 2 3 4 5 6 7 8 9]
Last 10 Elements of Last Row:
Virtual dataset:
[5089 5090 5091 5092 5093 5094 5095 5096 5097 5098]
Reading vdata into Array:
[5089 5090 5091 5092 5093 5094 5095 5096 5097 5098]
我正在尝试从使用 h5py 创建的虚拟 HDF 数据集加载数据,但在正确加载数据时遇到了一些问题。
这是我的问题的一个例子:
import h5py
import tools as ut
virtual = h5py.File(ut.params.paths.virtual)
a = virtual['part2/index'][:]
print(virtual['part2/index'][-1])
print(a[-1])
这输出:
[890176134]
[0]
为什么?为什么我将数据复制到 NumPy 数组 (value=[0]
) 与直接从数据集中读取 (value=[890176134]
) 时最后一个元素不同?
我是不是在没有意识到的情况下做错了什么?
非常感谢。
是的,您应该从虚拟数据集或从虚拟数据集创建的数组中获取相同的值。如果没有有关数据的更多详细信息,则很难诊断错误。
我使用 h5py 示例 vds_simple.py
来演示它的行为方式。大多数代码构建 HDF5 文件。最后的部分比较输出。下面的代码修改自示例以创建可变数量的源文件(由 a0=
定义)。
使用示例数据创建 'a0' 源文件的代码:
a0 = 5000
# create sample data
data = np.arange(0, 100).reshape(1, 100)
# Create source files (0.h5 to a0.h5)
for n in range(a0):
with h5py.File(f"{n}.h5", "w") as f:
row_data = data + n
f.create_dataset("data", data=row_data)
定义虚拟布局和assemble虚拟数据集的代码:
# Assemble virtual dataset
layout = h5py.VirtualLayout(shape=(a0, 100), dtype="i4")
for n in range(a0):
filename = "{}.h5".format(n)
vsource = h5py.VirtualSource(filename, "data", shape=(100,))
layout[n] = vsource
# Add virtual dataset to output file
with h5py.File("VDS.h5", "w", libver="latest") as f:
f.create_virtual_dataset("vdata", layout)
读取和打印数据的代码:
# read data back
# virtual dataset is transparent for reader!
with h5py.File("VDS.h5", "r") as f:
arr = f["vdata"][:]
print("\nFirst 10 Elements in First Row:")
print("Virtual dataset:")
print(f["vdata"][0, :10])
print("Reading vdata into Array:")
print(arr[0, :10])
print("Last 10 Elements of Last Row:")
print("Virtual dataset:")
print(f["vdata"][-1,-10:])
print("Reading vdata into Array:")
print(arr[-1,-10:])
上面代码的输出(w/a0=5000):
First 10 Elements in First Row:
Virtual dataset:
[0 1 2 3 4 5 6 7 8 9]
Reading vdata into Array:
[0 1 2 3 4 5 6 7 8 9]
Last 10 Elements of Last Row:
Virtual dataset:
[5089 5090 5091 5092 5093 5094 5095 5096 5097 5098]
Reading vdata into Array:
[5089 5090 5091 5092 5093 5094 5095 5096 5097 5098]