numpy 对象数据类型数据类型(‘O’)没有本机HDF5等效项

a64a0gku  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(147)

好的,似乎在堆栈溢出中提出了几个类似的问题,但似乎没有一个正确或正确地回答,也没有一个描述了确切的例子。
我在将数组或列表保存到hdf5时遇到问题...
我有一个包含(n,35)维的多个文件列表,其中每个文件中的n可能不同。它们中的每一个都可以用下面的代码保存在hdf5中。

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

然而,如果我想将它们合并到3D中,则会出现如下错误。
对象数据类型数据类型(‘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)

如何保存这样的数据?我尝试了几个测试,当我用更改它们时,似乎all_data变成了带有‘Object’的dtype

all_data = np.array(all_data)

这看起来它在保存hdf5方面也有类似的问题。
同样,我如何将这些数据保存在hdf5中?

xam8gpfp

xam8gpfp1#

我在使用h5py时遇到了类似的问题,使用array.astype更改NumPy数组的类型对我很有效(我相信这会将类型从dtype('O')更改为您指定的数据类型)。请参见下面的代码片段:

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)时创建的。

px9o7tmv

px9o7tmv2#

dtype('O')代表对象。在我的例子中,我有一个列表,其中的长度不同,但得到了相同的错误。如果将其转换为NumPy数组,NumPy将警告Creating an ndarray from ragged nested sequences。H5文件无法处理此类数据有关详细信息,请参阅this post

dgenwo3n

dgenwo3n3#

当我使用以下命令时出现此错误:

with h5py.File(peakfilename, 'w') as pfile:  # saves the data
        pfile['peakY'] = np.array(X)
        pfile['peakX'] = np.array(Y)

但是,当我在保存数组时使用dtype时...问题消失了..。我猜h5py不能从未定义的数据类型创建数据集。

with h5py.File(peakfilename, 'w') as pfile:  # saves the data
        pfile['peakY'] = np.array(X, dtype=np.float32)
        pfile['peakX'] = np.array(Y, dtype=np.float32)

相关问题