2012-12-05 9 views
6

numpyがデータを格納する方法(実数部と虚数部が連続している)を利用するには、numpy.complex64をサブクラス化しようとしていますが、自分の__add____sub__、...ルーチンを使用します。numpyのスカラー型をサブクラス化

私の問題は、私はdtype=mysubclass設定numpy.ndarrayを作るとき、私は上の加算、減算およびのための私自身の関数を使用していないnumpyのになり代わり、中dtype='numpy.complex64'numpy.ndarrayを得るということです。

例:

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の型システムのみPyArray_RegisterDataType機能を介して、Cから拡張するように設計されています。これはPythonからctypesを使ってこの機能にアクセスすることが可能ですが、私はそれをお勧めしません。 @sebergが記述しているように、CまたはCythonで拡張を書く方が良いか、サブクラス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を見てください。

ただし、このタイプをスカラーとしても使用したい場合は、たとえば、スカラーを索引付けしたい場合は、少なくとも現時点ではより困難になります。いくつかのreduce関数のために自分自身のスカラー型にスカラーに変換するために__array_wrap__を定義することでもう少し得ることができます。インデックス作成のためには、現在自分で__getitem__を定義している可能性があります。

このアプローチのすべてのケースでは、依然として複合データ型を使用します。明示的にオーバーライドされていないすべての関数は、同じように動作します。 @ecatmurはCの側から新しいデータ型を作ることができると言っています。

+0

Cでdtypeを作成する方が良い方法です。ありがとう! – Soren