2017-04-19 10 views
1

私は自分のカスタムクラスを実装してデータを格納しようとしています。私はこのようにそれにnumpyの関数を呼び出すことができるように、numpyのと互換性を持たせるにしたい:Python - NumPy関数と互換性のあるカスタムクラスを実装する方法は?

np.sin(my_object) 

私が使用しようとするとしかし、私は奇妙なエラーの多くを取得しています、__array_interface__と呼ばれる辞書があることを知っていますそれ。

import numpy as np 
import pandas as pd 

class TDF: 
    __array_interface__ = {'typestr': '|i1', 'version': 1} 

    def __init__(self): 
     self.ddata = pd.DataFrame([1, 2, 3]) 
     self.shape = self.ddata.shape 

    def __iter__(self): 
     return iter(self.ddata) 

    def __len__(self): 
     return len(self.ddata) 

    def __getitem__(self, key): 
     return self.ddata.__getitem__(key) 

if __name__ == '__main__': 
    tdf1 = TDF() 
    tdf = np.sin(tdf1) 

上記のコードは、私に実行時エラー与える:

ValueError: setting an array element with a sequence. 

は、私が何をしないのですか? 一方(クラスがnumpyの互換性があります)パンダのソースコードは、明示的にarray_interface辞書を使用していません...

答えて

1

を呼び出してみてください簡単な修正は非常によく

def __array__(self): 
    return self.ddata 
+1

ありがとうございます。はい、それが必要でした。また、numpy関数の結果を独自の型にしたい場合は、__array_wrap__メソッドを追加する必要があります。 –

+0

時には '__array_prepare__'もあります。すぐ近くのあなたに近づく: '__array_ufunc__'は、' __array_wrap__'が行うことのより良い仕事をします – Eric

0

あなたがオブジェクトに格納されたデータにアクセスしていません。変数tdf1は単なるTDFインスタンスですが、データはtdf1.ddataに格納されています。 np.sin(tdf1.ddata)

+0

を実装することであろう。それは確かに修正です – kmario23

+1

しかし、全体のポイントは、オブジェクトに直接格納されているデータに直接アクセスせずにアクセスすることです。 pandasオブジェクトにnumpy関数を使用する場合、pandasが内部的にデータを格納する変数を指定する必要はありません。 –

+0

@Tomasz R: '' def __array __(self):return np.array(self.ddata) '' – stovfl

関連する問題