2010-02-28 196 views
20

我正在创建一个numpy数组,用来填充我创建的特定类的对象。我想初始化数组,使它只会包含那个类的对象。例如,以下是我想要做的事情,以及如果我这样做会发生什么。numpy数组中的自定义数据类型

class Kernel: 
    pass 

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

TypeError: data type not understood 

我可以这样做:

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

然后的L每个元素分配为Kernel对象(或任何其他类型的对象)。从编程的角度(类型检查)和数学的(对函数集的操作),我可以得到一组Kernels。

有没有什么办法让我指定一个任意类的numpy数组的数据类型?

回答

18

如果你的Kernel类有可预测的成员数据量,那么你可以为它定义一个dtype而不是一个类。例如如果它是由9个浮标和一个int参数,你可以做

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

你必须做一些强制要操纵单个内核的方法,每次将它们变成类内核对象,但是这是一个将实际数据存储在NumPy数组中的方法。如果你只想存储一个引用,那么对象dtype是没有子类化ndarray的最佳选择。

+0

这就是我一直在寻找的!尽管我开始认为它的价值远远超过它的价值......请阅读np.dtype。 – 2010-03-01 15:01:15

1

据我所知,执行单一类型的用于在元件一个numpy.ndarray必须手动完成(除非该数组包含Numpy标量):没有内置的检查机制(您的数组有dtype = object)。如果您确实想要强制实施单一类型,则必须将子类化并使用适当方法(__setitem__等)执行检查。

如果您想要对一组函数(内核对象)执行操作,您可以通过直接在您的内核类中定义适当的操作来完成操作。这是我为我的uncertainties.py模块所做的,该模块处理带有不确定性的数字的numpy.ndarrays。