6

numpy のマトリックス クラスを継承する独自のマトリックス クラスを実装したいと考えています。

numpy のマトリックス コンストラクターには、 のような属性が必要です("1 2; 3 4'")。対照的に、私のコンストラクターは属性を必要とせず、デフォルトの属性をスーパーコンストラクターに設定する必要があります。

それが私がしたことです:

import numpy as np

class MyMatrix(np.matrix):
    def __init__(self):
        super(MyMatrix, self).__init__("1 2; 3 4")

if __name__ == "__main__":
    matrix = MyMatrix()

このエラーが発生し続けるため、このコードには愚かな間違いがあるに違いありません。

this_matrix = np.matrix()
TypeError: __new__() takes at least 2 arguments (1 given)

私はそれについて本当に無知であり、グーグルはこれまで役に立たなかった.

ありがとう!

4

1 に答える 1

5

良い質問!

ソースを見ると、ではなく で引数をnp.matrix設定しているように見えます。これは直感に反する動作ですが、それには十分な理由があると確信しています。data__new____init__

とにかく、以下は私にとってはうまくいきます:

class MyMatrix(np.matrix):
    def __new__(cls):
        # note that we have to send cls to super's __new__, even though we gave it to super already.
        # I think this is because __new__ is technically a staticmethod even though it should be a classmethod
        return super(MyMatrix, cls).__new__(cls, "1 2; 3 4")

mat = MyMatrix()

print mat
# outputs [[1 2] [3 4]]

補遺: 必要な動作のために、サブクラスではなくファクトリ関数の使用を検討することをお勧めします。__new__これにより、次のコードが得られます。これは、はるかに短くて明確であり、 -vs-__init__実装の詳細に依存しません。

def mymatrix():
    return np.matrix('1 2; 3 4')

mat = mymatrix()
print mat
# outputs [[1 2] [3 4]]

もちろん、他の理由でサブクラスが必要になる場合もあります。

于 2012-10-30T17:45:41.087 に答える