【问题标题】:Object dtype dtype('O') has no native HDF5 equivalentObject dtype dtype('O') 没有原生 HDF5 等效项
【发布时间】:2019-04-20 20:55:22
【问题描述】:

嗯,这里似乎在堆栈溢出中提出了几个类似的问题,但似乎没有一个问题得到正确或正确的回答,也没有描述确切的示例。

我在将数组或列表保存到 hdf5 时遇到问题...

我有几个文件包含 (n, 35) 个维度的列表,其中每个文件中的 n 可能不同。它们中的每一个都可以使用下面的代码保存在 hdf5 中。

hdf = hf.create_dataset(fname, data=d)

但是,如果我想将它们合并到 3d 中,则会出现如下错误。

Object dtype dtype('O') 没有原生 HDF5 等效项

我不知道为什么它会变成 dtype 对象,因为我所做的只是这个

all_data = list()
for fname in file_list:
    d = np.load(fname)
    all_data.append(d)
hdf = hf.create_dataset('all_data', data=all_data)

如何保存这些数据? 我尝试了几个测试,当我用 'object' 更改它们时,似乎 all_data 变成了 dtype

all_data = np.array(all_data)

看起来它与保存 hdf5 有类似的问题。

再次,我怎样才能将这些数据保存在 hdf5 中?

【问题讨论】:

  • 由于d 的形状各不相同,numpy 无法从中创建 3d 数组。它必须改为创建一个 1d 对象 dtype 数组。 h5py 无法保存(它只保存数组,不保存列表或其他 python 对象)。您将接受原始格式,每个 dataset 一个数组。
  • 您相邻的 SO 问题中的类似问题:stackoverflow.com/questions/53358695/…
  • 另见stackoverflow.com/a/46422242/3327666(有关为什么只能在 HDF5 文件中存储简单数组的一些详细信息)。

标签: numpy hdf5


【解决方案1】:

我遇到了与h5py 类似的问题,并且使用array.astype 更改NumPy 数组的类型对我有用(我相信这会将类型从dtype('O') 更改为您指定的数据类型)。请看下面的代码sn-p:

import numpy as np

print(X.dtype) 
--> dtype('O')

print(X.astype(np.float64).dtype)
--> dtype('float64')

当我使用这种数据类型转换运行h5.create_dataset 时,我能够成功创建一个 h5 数据集。希望这会有所帮助!

一个附加更新:我相信 NumPy 对象类型 'O' 是在 NumPy 数组本身具有混合元素类型(例如 np.int8np.float32)时创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2020-09-15
    • 2019-09-03
    • 2018-07-04
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多