子类化numpy标量类型

时间:2012-12-05 18:00:41

标签: python numpy subclass user-defined-types

我正在尝试子类化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

2 个答案:

答案 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端创建新的数据类型,如果这真的是你想要的。