NumPy数组中的自定义数据类型

32
我正在创建一个numpy数组,用于存储我已经创建的特定类的对象。我想初始化该数组,使其只包含该类的对象。例如,这是我想做的事情,以及如果我这样做会发生什么。
class Kernel:
    pass

>>> L = np.empty(4,dtype=Kernel)

TypeError: data type not understood

我可以做到这一点:

>>> L = np.empty(4,dtype=object)

然后将L的每个元素都分配为一个Kernel对象 (或任何其他类型的对象)。如果我能够拥有一个由Kernel数组组成的数组,这将非常方便,从编程角度(类型检查)和数学角度(对函数集合进行操作)来看。

是否有办法让我使用任意类来指定numpy数组的数据类型?

3个回答

33
如果您的Kernel类具有可预测的成员数据数量,则可以为其定义一个dtype,而不是一个类。例如,如果它由9个浮点数和一个整数参数化,则可以执行以下操作:
kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
arr = np.empty(dims, dtype=kerneldt)
你需要进行一些强制转换以将它们转换为Kernel类对象,每次想要操作单个内核的方法时都需要这样做,但这是将实际数据存储在NumPy数组中的一种方式。如果你只想存储引用,那么对象dtype是最好的选择,而不需要子类化ndarray。

这正是我在寻找的!虽然我开始觉得这比它值得的要多得多...会阅读有关np.dtype的内容。 - Mike Dewar


2
据我所知,对于numpy.ndarray中的元素强制使用单一类型必须手动完成(除非数组包含Numpy标量):没有内置的检查机制(您的数组具有dtype = object)。如果您真的想强制使用单一类型,则必须子类化ndarray并在适当的方法(__setitem__等)中实现检查。
如果您想在一组函数(内核对象)上实现操作,您可以通过直接在Kernel类中定义适当的操作来实现。这就是我为我的uncertainties.py模块所做的事情,该模块处理带有不确定性数字的numpy.ndarrays。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接