我正在创建一个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数组的数据类型?
答案 0 :(得分:22)
如果您的Kernel类具有可预测数量的成员数据,那么您可以为其定义dtype而不是类。例如如果它由9个浮点数和一个int参数化,你可以做
kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
arr = np.empty(dims, dtype=kerneldt)
每次想要操作单个内核的方法时,你必须做一些强制将它们变成类内核的对象,但这是将实际数据存储在NumPy数组中的一种方法。如果你只想存储一个引用,那么没有子类化ndarray就可以做到最好的对象dtype。
答案 1 :(得分:3)
它必须是Numpy标量类型:
http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-in
或ndarray的子类:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html#numpy.ndarray
答案 2 :(得分:1)
据我所知,为numpy.ndarray中的元素强制执行单一类型必须手动完成(除非数组包含Numpy标量):没有内置的检查机制(你的数组有dtype = object) 。如果你真的想要强制执行单一类型,你必须子类化ndarray并在适当的方法(__setitem__
等)中实现检查。
如果要对一组函数(内核对象)实现操作,则可以通过直接在Kernel类中定义正确的操作来实现。这就是我为uncertainties.py模块所做的事情,该模块处理具有不确定性的数字的numpy.ndarrays。