【发布时间】:2016-10-17 02:14:47
【问题描述】:
我正在尝试构建一个在 python 中读取复杂 HDF5 数据文件的库。
我遇到了一个问题,HDF5 Dataset 以某种方式实现了默认数组协议(有时),这样当从它创建一个 numpy 数组时,它会转换为特定的数组类型。
In [8]: ds
Out[8]: <HDF5 dataset "two_by_zero_empty_matrix": shape (2,), type "<u8">
In [9]: ds.value
Out[9]: array([2, 0], dtype=uint64)
这个Dataset对象,实现了numpy数组协议,当数据集由数字组成时,它提供了一个默认的数组类型。
In [10]: np.array(ds)
Out[10]: array([2, 0], dtype=uint64)
但是,如果数据集不是由数字组成,而是由其他一些对象组成,如您所料,它只使用 np.object 类型的 numpy 数组:
In [43]: ds2
Out[43]: <HDF5 dataset "somecells": shape (2, 3), type "|O8">
In [44]: np.array(ds2)
Out[44]:
array([[<HDF5 object reference>, <HDF5 object reference>,
<HDF5 object reference>],
[<HDF5 object reference>, <HDF5 object reference>,
<HDF5 object reference>]], dtype=object)
这种行为可能看起来很方便,但在我的情况下它实际上很不方便,因为它干扰了我对数据文件的递归遍历。解决这个问题确实很困难,因为有很多不同的可能数据类型,根据它们是对象的子对象还是数字数组,它们的特殊情况会有所不同。
我的问题是:有没有办法抑制默认的数组创建协议,这样我就可以从想要转换为其自然鸭类型的数据集对象创建一个 object 数组?
也就是说,我想要类似:np.array(ds, dtype=object),这将产生[<Dataset object of type int>, dtype=object] 的数组,而不是[3 4 5, dtype=int]。
但是np.array(ds, dtype=np.object) 抛出IOError: Can't read data (No appropriate function for conversion path)
我认真地尝试在谷歌上搜索一些关于 numpy 数组协议工作的文档,并找到了很多,但在我看来,没有人真正考虑过有人可能想要这种行为的可能性。
【问题讨论】: