"Cannot create cython.array from NULL pointer" 在 Python 中索引 HDF5 数据集时出错
"Cannot create cython.array from NULL pointer" error when indexing an HDF5 dataset in Python
我正在使用 h5py 包从 HDF5 文件中提取数据并使用 Python 对其进行操作。文件h5Test.pph中有一个名为“Bodies”的数据集,所以我首先设置为:
import h5py
f = h5py.File('h5Test.pph', 'r')
bodies = f['Bodies']
从那里我可以访问 bodies
中的大多数索引(例如 0、4、1000),但由于某些原因 bodies[2]
和 bodies[3]
导致此错误
ValueError: Cannot create cython.array from NULL pointer
我已经使用 h5dump 命令行工具确认了这些条目的存在,数据看起来没有什么奇怪的。我对 HDF5 文件和堆栈溢出都是新手,所以请让我知道是否有任何有用的附加信息。
编辑以获取更多信息:
numpy.shape(bodies)
returns
(10689,)
和numpy.dtype(bodies)
returns
dtype({'names':['ID','Name','Orientation','Color','Position','Velocity','Angular velocity','Change in w in body frame','Force','Torque','Additional force','Temperature','Angular momentum','Principal moments of inertia','Mass','Volume','Scale','Shape','Group','Material','Mode','Lua control functions','Monitored','Stress'], 'formats':[[('ID', '<i8')],[('data', 'O')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('w', '<f4')],[('red', '<f4'), ('green', '<f4'), ('blue', '<f4'), ('alpha', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],'<f4',[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],'<f4','<f4','<f4',[('ID', '<i8')],[('ID', '<i8')],[('ID', '<i8')],'<u4','O','u1',{'names':['[0, 0]','[0, 1]','[0, 2]','[1, 0]','[1, 1]','[1, 2]','[2, 0]','[2, 1]','[2, 2]'], 'formats':['<f4','<f4','<f4','<f4','<f4','<f4','<f4','<f4','<f4'], 'offsets':[0,12,24,4,16,28,8,20,32], 'itemsize':36}], 'offsets':[0,8,16,32,48,60,72,84,96,108,120,132,136,148,160,164,168,172,180,188,196,200,216,217], 'itemsize':253})
又比如,bodies[0]
returns
((1487,), (b'compactor_disk',), (0., 0., 0., 1.), (0.38671875, 0.38671875, 0.38671875, 0.5859375), (0., 0., 0.), (0., 0., 0.), (0., 0., 0.), (0., 0., 0.), (-0.72721094, 0.20889588, -41.384094), (0.01420393, 0.34127262, 0.05411187), (0., 0., 0.), 0., (0., 0., 0.), (2.5448524e-06, 2.5513377e-06, 4.367137e-06), 0.00292779, 3.9037224e-07, 10., (14954,), (1736,), (1738,), 16, array([(22769,)], dtype=[('ID', '<i8')]), 1, (1035920.44, -53857.83, 874206.7, 84758.26, 1571146.4, -36402.49, -16.688602, -17.05545, 553.0667))
使用命令 h5dump -d Bodies h5Test.pph
会产生相当长的输出,但导致错误的元素之一是:
(2): {
{
1489
},
{
"lid"
},
{
0,
0,
0,
1
},
{
0.386719,
0.386719,
0.386719,
0.585938
},
{
0,
0,
0.3
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
0,
{
0,
0,
0
},
{
2.59831e-06,
2.60443e-06,
4.41639e-06
},
0.00282375,
3.765e-07,
10,
{
15293
},
{
1736
},
{
1738
},
16,
(),
0,
{
0,
0,
0,
0,
0,
0,
0,
0,
0
}
},
让我们从 HDF5 和 h5py 的一些基础知识开始。当您输入 bodies = f['Bodies']
时,return (bodies
) 是一个 h5py 数据集对象,其行为类似于 NumPy 数组。您可以从 shape
和 dtype
调用中获取数据集的详细信息。
这个数据集类似于一个包含 10689 行异构数据的 recarray。每个字段(列)的 dtype 由 2 个键的字典定义:'names'
和 'formats'
——它们作为配对列表工作。例如,字段 1 是一个名为 'ID'
的整数数组;字段 2 是一个名为 'Name'
的 Python 对象;字段 3 一个名为 'Orientation' 的 4 个浮点数数组,数组成员分别为:'x', 'y', 'z', 'w'
。这继续向下 names/format 对。有些字段要复杂得多:最后一个,'Stress'
引用另一个字典,'Lua control functions'
是另一个 Python 对象。 (HDF5 支持不映射到标准 NumPy 数据类型的数据结构——在这些情况下,h5py 在重新排列中使用它们——示例包括 nd.arrays、列表、字典等)
因此,当您输入 bodies[i]
时,您正在读取数据集中的第 i 行数据。这是 bodies[0]
的输出映射到数据集的方式:
bodies[0]['ID'] = 1487
bodies[0]['Name'] = b'compactor_disk'
bodies[0]['Orientation'] = (0., 0., 0., 1.)
并且,根据 h5dump
的输出,bodies[2]
的输出应该 映射到数据集:
bodies[2]['ID'] = 1489
bodies[2]['Name'] = b'lid'
bodies[2]['Orientation'] = (0, 0, 0, 1)
Note they look like ints and not floats - not sure if that is a problem.
正如@hpaulj 所指出的,'Lua control functions'
两行的输出看起来不同。 bodies[2] 的数组长度为零,这可能就是问题所在。
您可以单独(按名称)访问每个 field/column 中的数据。创建一个循环,看看是否可以找出导致问题的字段。下面的代码是您可以这样做的方式:
with h5py.File('h5Test.pph', 'r') as h5f:
bodies = h5f['Bodies']
for field in bodies.dtype.names:
print('reading field:',field)
temp = bodies[field]
我正在使用 h5py 包从 HDF5 文件中提取数据并使用 Python 对其进行操作。文件h5Test.pph中有一个名为“Bodies”的数据集,所以我首先设置为:
import h5py
f = h5py.File('h5Test.pph', 'r')
bodies = f['Bodies']
从那里我可以访问 bodies
中的大多数索引(例如 0、4、1000),但由于某些原因 bodies[2]
和 bodies[3]
导致此错误
ValueError: Cannot create cython.array from NULL pointer
我已经使用 h5dump 命令行工具确认了这些条目的存在,数据看起来没有什么奇怪的。我对 HDF5 文件和堆栈溢出都是新手,所以请让我知道是否有任何有用的附加信息。
编辑以获取更多信息:
numpy.shape(bodies)
returns
(10689,)
和numpy.dtype(bodies)
returns
dtype({'names':['ID','Name','Orientation','Color','Position','Velocity','Angular velocity','Change in w in body frame','Force','Torque','Additional force','Temperature','Angular momentum','Principal moments of inertia','Mass','Volume','Scale','Shape','Group','Material','Mode','Lua control functions','Monitored','Stress'], 'formats':[[('ID', '<i8')],[('data', 'O')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('w', '<f4')],[('red', '<f4'), ('green', '<f4'), ('blue', '<f4'), ('alpha', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],'<f4',[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],[('x', '<f4'), ('y', '<f4'), ('z', '<f4')],'<f4','<f4','<f4',[('ID', '<i8')],[('ID', '<i8')],[('ID', '<i8')],'<u4','O','u1',{'names':['[0, 0]','[0, 1]','[0, 2]','[1, 0]','[1, 1]','[1, 2]','[2, 0]','[2, 1]','[2, 2]'], 'formats':['<f4','<f4','<f4','<f4','<f4','<f4','<f4','<f4','<f4'], 'offsets':[0,12,24,4,16,28,8,20,32], 'itemsize':36}], 'offsets':[0,8,16,32,48,60,72,84,96,108,120,132,136,148,160,164,168,172,180,188,196,200,216,217], 'itemsize':253})
又比如,bodies[0]
returns
((1487,), (b'compactor_disk',), (0., 0., 0., 1.), (0.38671875, 0.38671875, 0.38671875, 0.5859375), (0., 0., 0.), (0., 0., 0.), (0., 0., 0.), (0., 0., 0.), (-0.72721094, 0.20889588, -41.384094), (0.01420393, 0.34127262, 0.05411187), (0., 0., 0.), 0., (0., 0., 0.), (2.5448524e-06, 2.5513377e-06, 4.367137e-06), 0.00292779, 3.9037224e-07, 10., (14954,), (1736,), (1738,), 16, array([(22769,)], dtype=[('ID', '<i8')]), 1, (1035920.44, -53857.83, 874206.7, 84758.26, 1571146.4, -36402.49, -16.688602, -17.05545, 553.0667))
使用命令 h5dump -d Bodies h5Test.pph
会产生相当长的输出,但导致错误的元素之一是:
(2): {
{
1489
},
{
"lid"
},
{
0,
0,
0,
1
},
{
0.386719,
0.386719,
0.386719,
0.585938
},
{
0,
0,
0.3
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
{
0,
0,
0
},
0,
{
0,
0,
0
},
{
2.59831e-06,
2.60443e-06,
4.41639e-06
},
0.00282375,
3.765e-07,
10,
{
15293
},
{
1736
},
{
1738
},
16,
(),
0,
{
0,
0,
0,
0,
0,
0,
0,
0,
0
}
},
让我们从 HDF5 和 h5py 的一些基础知识开始。当您输入 bodies = f['Bodies']
时,return (bodies
) 是一个 h5py 数据集对象,其行为类似于 NumPy 数组。您可以从 shape
和 dtype
调用中获取数据集的详细信息。
这个数据集类似于一个包含 10689 行异构数据的 recarray。每个字段(列)的 dtype 由 2 个键的字典定义:'names'
和 'formats'
——它们作为配对列表工作。例如,字段 1 是一个名为 'ID'
的整数数组;字段 2 是一个名为 'Name'
的 Python 对象;字段 3 一个名为 'Orientation' 的 4 个浮点数数组,数组成员分别为:'x', 'y', 'z', 'w'
。这继续向下 names/format 对。有些字段要复杂得多:最后一个,'Stress'
引用另一个字典,'Lua control functions'
是另一个 Python 对象。 (HDF5 支持不映射到标准 NumPy 数据类型的数据结构——在这些情况下,h5py 在重新排列中使用它们——示例包括 nd.arrays、列表、字典等)
因此,当您输入 bodies[i]
时,您正在读取数据集中的第 i 行数据。这是 bodies[0]
的输出映射到数据集的方式:
bodies[0]['ID'] = 1487
bodies[0]['Name'] = b'compactor_disk'
bodies[0]['Orientation'] = (0., 0., 0., 1.)
并且,根据 h5dump
的输出,bodies[2]
的输出应该 映射到数据集:
bodies[2]['ID'] = 1489
bodies[2]['Name'] = b'lid'
bodies[2]['Orientation'] = (0, 0, 0, 1)
Note they look like ints and not floats - not sure if that is a problem.
正如@hpaulj 所指出的,'Lua control functions'
两行的输出看起来不同。 bodies[2] 的数组长度为零,这可能就是问题所在。
您可以单独(按名称)访问每个 field/column 中的数据。创建一个循环,看看是否可以找出导致问题的字段。下面的代码是您可以这样做的方式:
with h5py.File('h5Test.pph', 'r') as h5f:
bodies = h5f['Bodies']
for field in bodies.dtype.names:
print('reading field:',field)
temp = bodies[field]