我正在尝试子类化numpy.complex64
以便使用numpy存储数据的方式(连续的,交替的实部和虚部)但使用我自己的__add__
,{{1} ,...例程。
我的问题是,当我设置__sub__
,设置numpy.ndarray
时,我会dtype=mysubclass
取代numpy.ndarray
,导致numpy不使用我自己的功能增加,减少等等。
示例:
dtype='numpy.complex64'
输出:
import numpy as np
class mysubclass(np.complex64):
pass
a = mysubclass(1+1j)
A = np.empty(2, dtype=mysubclass)
print type(a)
print repr(A)
有谁知道怎么做?
提前致谢 - Soren
答案 0 :(得分:3)
NumPy类型系统仅设计为通过PyArray_RegisterDataType
功能从C扩展。 可能可以使用ctypes从Python访问此功能,但我不推荐它;最好在C或Cython中编写扩展,或者在@seberg描述的子类ndarray
中编写。{/ p>
NumPy源代码树中有一个简单的示例dtype:newdtype_example/floatint.c。如果你进入Pyrex,pytables来源中的reference.pyx可能值得一看。
答案 1 :(得分:3)
请注意,标量和数组在numpy中是完全不同的。 np.complex64
(这是32位浮点数,只是要注意,而不是双精度)。您将无法像这样更改数组,您需要替代数组,然后覆盖其__add__
和__sub__
。
如果这就是你想做的全部,那么它应该只是工作,否则看看http://docs.scipy.org/doc/numpy/user/basics.subclassing.html,因为继承数组并不那么简单。
但是,如果您想将此类型也用作标量。例如,您想要将标量索引出来,至少目前它变得更加困难。您可以通过将__array_wrap__
定义为将标量转换为您自己的标量类型以获得某些reduce函数来进一步了解,以便在所有情况下都可以使用索引来查找您可能已定义自己的__getitem__
目前。
在使用此方法的所有情况下,您仍然使用复杂数据类型,并且未显式覆盖的所有函数仍将表现相同。 @ecatmur提到你可以从C端创建新的数据类型,如果这真的是你想要的。