7

我正在尝试子类numpy.complex64化以利用 numpy 存储数据的方式(连续的、交替的实部和虚部),但使用我自己的__add__, __sub__, ... 例程。

我的问题是,当我进行 a numpy.ndarray, setting时dtype=mysubclass,我得到 a numpy.ndarraywith dtype='numpy.complex64',这导致 numpy 不使用我自己的函数进行加法、减法等。

例子:

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)

输出:

<class '__main__.mysubclass'>
array([ -2.07782988e-20 +4.58546896e-41j,  -2.07782988e-20 +4.58546896e-41j], dtype=complex64)'

有谁知道如何做到这一点?

提前致谢 - 索伦

4

2 回答 2

3

NumPy 类型系统仅设计为通过PyArray_RegisterDataType函数从 C 扩展。可能可以使用 ctypes 从 Python 访问此功能,但我不推荐它;最好用 C 或 Cython 或ndarray@seberg 描述的子类编写扩展。

NumPy 源代码树中有一个简单的示例 dtype:newdtype_example/floatint.c。如果你喜欢 Pyrex, pytables 源代码中的reference.pyx可能值得一看。

于 2012-12-05T18:29:04.943 回答
3

请注意,标量和数组在 numpy 中是完全不同的。np.complex64(这是 32 位浮点数,请注意,不是双精度)。您将无法像那样更改数组,您需要对数组进行子类化,然后覆盖它的__add__and __sub__

如果这就是您想要做的,它应该只是工作,否则请查看http://docs.scipy.org/doc/numpy/user/basics.subclassing.html因为子类化数组并不是那么简单。

但是,如果您想将此类型也用作标量。例如,您想索引标量,至少目前它变得更加困难。您可以通过定义__array_wrap__将一些reduce函数转换为您自己的标量类型来进一步了解索引,以便在所有情况下都可以使用索引,在我看来,您__getitem__目前可能已经定义了自己的。

在使用这种方法的所有情况下,您仍然使用 complex 数据类型,并且所有未显式重写的函数的行为仍然相同。@ecatmur 提到您可以从 C 端创建新的数据类型,如果这确实是您想要的。

于 2012-12-05T18:32:31.403 回答