2012-12-05 76 views
6

我試圖繼承子類numpy.complex64以便利用numpy存儲數據的方式(連續的,交替的實部和虛部),但是使用我自己的__add__,__sub__,...例程。子類化numpy標量類型

我的問題是,當我做一個numpy.ndarray,設置dtype=mysubclass,我代替,導致numpy的不是用我自己的功能加法,減法等得到numpy.ndarraydtype='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) 

輸出:

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

有誰知道如何做到這一點?

預先感謝 - 索倫

+0

我覺得最近看到了一個類似的問題,但現在找不到它...... – NPE

回答

3

的NumPy的類型系統僅設計從C通過PyArray_RegisterDataType功能被擴展。它可能可能可能使用ctypes從Python訪問此功能,但我不會推薦它;最好用C或Cython編寫擴展,或者按照@seberg描述的子類ndarray

NumPy源代碼樹中有一個簡單的dtype示例:newdtype_example/floatint.c。如果你進入Pyrex,在pytables源碼中的reference.pyx可能值得一看。

+0

我一直希望能夠保持C語言,但我猜這種東西很難避免。 我會看看這個例子,試試我的運氣 - 謝謝! – Soren

3

請注意,標量和數組在numpy上有很大的不同。 np.complex64(這是32位浮點數,只是爲了說明,不是雙精度)。你將不能像這樣改變數組,你需要改寫數組的子類,然後覆蓋它的__add____sub__

如果這就是你想要做的,那麼它應該工作,否則看http://docs.scipy.org/doc/numpy/user/basics.subclassing.html,因爲子類化一個數組並不那麼簡單。

但是,如果你想使用這種類型也作爲標量。例如,你想爲標量索引,至少目前它變得更加困難。通過定義__array_wrap__將標量轉換爲您自己的標量類型以實現某些縮減功能,您可以進一步瞭解索引以便在所有情況下都能正常工作,在我看來,您可能已經定義了自己的__getitem__

在所有使用此方法的情況下,仍然使用複雜的數據類型,並且所有未被顯式覆蓋的函數仍將表現相同。 @ecatmur提到你可以從C端創建新的數據類型,如果這真的是你想要的。

+0

看來在C中創建dtype是更好的方法。謝謝! – Soren