【问题标题】:"Cannot create cython.array from NULL pointer" error when indexing an HDF5 dataset in Python在 Python 中索引 HDF5 数据集时出现“无法从 NULL 指针创建 cython.array”错误
【发布时间】:2021-09-29 05:02:02
【问题描述】:

我正在使用 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) 返回

(10689,)

然后numpy.dtype(bodies) 返回

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] 返回

((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
         }
      },

【问题讨论】:

  • 您的意思是bodies = f['Bodies']?复制您使用的代码时,您需要准确无误。完整的错误消息也很有用。请记住,我们并没有越过你的肩膀,也不能(或至少应该)猜测。如果bodies 是一个数据集,最好显示它的shapedtype
  • 没错,我很抱歉!我已将其更改为 f['Bodies'] 并添加了更多信息。
  • 我想知道倒数第三个字段是否会出现“Lua 控制功能”问题。在 [0] 它是一个数组,在 [2] 我看到 '()'

标签: python hdf5 h5py


【解决方案1】:

让我们从一些 HDF5 和 h5py 基础知识开始。当您输入 bodies = f['Bodies'] 时,返回 (bodies) 是一个 h5py 数据集对象,其行为类似于 NumPy 数组。您可以从 shapedtype 调用中获取数据集的详细信息。

此数据集类似于包含 10689 行异构数据的重新数组。每个字段(列)的 dtype 由 2 个键的字典定义:'names''formats' - 它们作为配对列表工作。例如,字段 1 是一个名为 'ID' 的整数数组;字段 2 是一个名为 'Name' 的 Python 对象;字段 3 是一个名为“Orientation”的 4 个浮点数组,数组成员分别为:'x', 'y', 'z', 'w'。这将延续到名称/格式对。有些字段要复杂得多:最后一个,'Stress' 引用另一个字典,'Lua control functions' 是另一个 Python 对象。 (HDF5 支持不映射到标准 NumPy 数据类型的数据结构——在这些情况下,h5py 在 recarrays 中使用它们——示例包括 nd.arrays、Lists、Dictionaries 等)

因此,当您输入 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' 输出对于 2 行看起来不同。 body[2] 的数组长度为零,这可能是问题所在。

您可以单独访问每个字段/列中的数据(按名称)。创建一个循环,看看是否可以隔离导致问题的字段。下面的代码是您可以这样做的方式:

with h5py.File('h5Test.pph', 'r') as h5f:
    bodies = h5f['Bodies']
    for field in bodies.dtype.names:
        print('reading field:',field)
        temp = bodies[field]

【讨论】:

  • 我认为你和@hpaulj 肯定是正确的,它与 lua 控制功能有关,因为我现在记得我在 GUI 中配置了生成此文件的每个主体,除了对于给我错误的两个。我无法使用您的代码,因为bodies.keys() 产生了一个错误:AttributeError: 'Dataset' object has no attribute 'keys',并且由于我最初收到的相同错误消息,我也无法通过bodies[2][0] 等进行索引。无论如何,确定问题后,您知道我该如何解决或解决它吗?
  • 很抱歉。我使用.keys() 遍历字段名称并打印它们。我应该使用 .dtype.names 。解决方法是不提取 lua 控制函数数据(假设这是罪魁祸首)。使用上面的代码,您可以按名称访问其他字段。例如bodies['ID'] 将给出一个包含所有 ID 的数组,bodies['Velocity'] 将返回一个包含所有 [x,y,z] Velocity 数组的数组。您可以使用bodies[2]['ID']bodies[2]['Velocity'] 获取特定的行和字段。
  • 好的,谢谢!看起来 bodies[2]['ID'] 和所有其他此类语句仍然会导致与以前相同的错误,但 bodies['ID'][2] 工作正常,应该是一个非常好的解决方法。
  • 有趣。根据过去的经验,我已经能够使用以下任一索引顺序读取异构数组数据:[row#]['field']['field'][row#]。我想知道为什么你的不同(主要是修辞)。您应该向开发人员报告“Lua 控制函数”条目的空数组。解决方法很头疼。
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2019-09-28
  • 1970-01-01
  • 2021-07-01
  • 2017-04-27
相关资源
最近更新 更多