NumPy数组中的自定义数据类型
我正在创建一个numpy数组,里面要填充我自己定义的某个类的对象。我想初始化这个数组,让它只包含这个类的对象。比如,我想这样做,但如果我这么做,会发生什么。
class Kernel:
pass
>>> L = np.empty(4,dtype=Kernel)
TypeError: data type not understood
我可以这样做:
>>> L = np.empty(4,dtype=object)
然后我可以把数组中的每个元素都赋值为一个Kernel
对象(或者其他类型的对象)。如果我能有一个只包含Kernel
对象的数组,那就太好了,这样从编程的角度(类型检查)和数学的角度(对函数集合的操作)来看都会很方便。
有没有什么方法可以让我用一个自定义的类来指定numpy数组的数据类型呢?
3 个回答
2
据我所知,要让一个numpy.ndarray里的元素都保持同一种类型,得自己手动去做(除非数组里是Numpy的标量)。因为它没有内置的检查机制(你的数组类型是dtype=object)。如果你真的想要强制使用同一种类型,你需要创建一个ndarray的子类,并在合适的方法里实现这些检查(比如__setitem__
等)。
如果你想对一组函数(Kernel对象)进行操作,你可以直接在你的Kernel类里定义合适的操作。这就是我为我的uncertainties.py模块所做的,它处理带有不确定性的数字的numpy.ndarrays。
34
如果你的Kernel类里面的数据量是固定的,那你可以为它定义一个数据类型,而不是用类来表示。例如,如果它有9个浮点数和一个整数作为参数,你可以这样做:
kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
arr = np.empty(dims, dtype=kerneldt)
每次你想用某个Kernel的功能时,你需要把这些数据转换成Kernel类的对象,不过这是一种把实际数据存储在NumPy数组里的方法。如果你只想存储一个引用,那么使用对象数据类型是最好的选择,这样就不需要去继承ndarray了。