7

numpy がデータを格納する方法を利用するためにサブクラス化しようとしてnumpy.complex64いますが (実数部分と虚数部分が連続して交互になっています)、独自の__add__, __sub__, ... ルーチンを使用しています。

私の問題は、numpy.ndarray, settingを作成すると、代わりにwithが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)'

誰もこれを行う方法を知っていますか?

前もって感謝します - ソレン

4

2 に答える 2

3

numpy では、スカラーと配列はまったく異なることに注意してください。np.complex64(これは 32 ビット浮動小数点であり、倍精度ではありません)。そのように配列を変更することはできません。代わりに配列をサブクラス化し、その__add__とをオーバーライドする必要があります__sub__

それ以外の場合は、http://docs.scipy.org/doc/numpy/user/basics.subclassing.htmlを参照してください。配列のサブクラス化はそれほど単純ではないためです。

ただし、この型をスカラーとしても使用する場合。たとえば、スカラーのインデックスを作成したい場合、少なくとも現在はより困難になります。__array_wrap__いくつかのreduce関数のスカラーを独自のスカラー型に変換するように定義することで、もう少し先に進めることができます__getitem__.

このアプローチのすべての場合で、引き続き複合データ型を使用し、明示的にオーバーライドされていないすべての関数は引き続き同じように動作します。@ecatmur は、それが本当に必要な場合は、C 側から新しいデータ型を作成できると述べました。

于 2012-12-05T18:32:31.403 に答える
3

NumPy 型システムは、関数を介して C から拡張されるようにのみ設計されていPyArray_RegisterDataTypeます。ctypes を使用して Python からこの機能にアクセスすることは可能かもしれませんが、お勧めしませんCまたはCythonで拡張機能を作成するかndarray、@sebergが説明するようにサブクラスを作成することをお勧めします。

NumPy ソース ツリーに単純な dtype の例があります: newdtype_example/floatint.c。Pyrex に興味がある場合は、pytables ソースのreference.pyxを一見の価値があるかもしれません。

于 2012-12-05T18:29:04.943 に答える