私はよく開発されたPythonクラス(Foo1D
と呼ぶ)を使用していますが、これは素晴らしいメソッドを備えていますが、1Dデータに対してのみ機能します。レポをフォークし、2Dデータを処理するすべてのメソッドを変更するのは非常に時間がかかります。クラスのリストを反復するPythonラッパー
だから、私は、無相関2D入力を受け付ける「ベクトル化」ラッパーFoo2D
を作るのが好きFoo1D
オブジェクトの集合に変換し、メソッドが呼び出され、コレクションを反復処理し、結果の配列を返すと思います。
は、ここで私が試したものです:
はclass Foo1D(object):
def __init__(self, data1D):
self.offset = 20
self.data = data1D+self.offset
def multiply(self, x):
return self.data*x
def add(self, a):
return self.data+a
class Foo2D(object):
def __init__(self, data2D):
dummy = Foo1D(data2D[0])
self.__class__ = type(dummy.__class__.__name__, (self.__class__, dummy.__class__), {})
self.__dict__ = dummy.__dict__
del dummy
self.data2D = [Foo1D(data1D) for data1D in data2D]
def __getattr__(self, item, *args, **kwargs):
result = [getattr(data1D, item)(*args, **kwargs) for data1D in self.data2D]
return np.array(result)
これが正しい属性でFoo1D
とFoo2D
オブジェクトを作成しますが、期待通りにFoo2D
方法は動作しません。例:私はA.multiply(2)
を実行すると、期待どおり
a1D = np.arange(10)
a2D = a1D.reshape(2,5)
A = Foo1D(a1D)
B = Foo2D(a2D)
は、だから私はarray([40, 42, 44, 46, 48, 50, 52, 54, 56, 58])
を取得します。
しかし、私がB.multiply(2)
を実行すると、私はarray([[40, 42, 44, 46, 48],[50, 52, 54, 56, 58]])
を得ると期待してarray([40, 42, 44, 46, 48])
を得る。これは、B.data
がa2D
の最初の要素にすぎない理由がわかりません。
もし私がnp.array([getattr(i, 'multiply')(2) for i in B.data2D])
を実行すれば、私は期待した答えが得られますarray([[40, 42, 44, 46, 48],[50, 52, 54, 56, 58]])
。
これはなぜ起こっているのですか?ありがとう!
素晴らしい!どうもありがとうございました。 –
特定のメソッドを呼び出すときに 'TypeError:super(type、obj):objがインスタンスまたはサブタイプである必要があります。 'という行7を' return super().__ getattribute __(attr) 'に変更して動作させます今の魅力のように。再度、感謝します! –
ああ、はい。これはPython 2対3の問題です。私のコードはPython 2用に書かれており、Python 3を実行しています。 – shockburner