1

numpy 行列のリストを操作しようとしていますが、厄介な問題が発生しています。

10 個の 2x2 ゼロ行列のリストから始めるとしましょう

para=[numpy.matrix(numpy.zeros((2,2)))]*(10)

このような個々のマトリックスにアクセスします

para[0]
para[1]

等々。ここまでは順調ですね。

ここで、2 番目の行列の最初の行のみを変更し、他の行はすべて変更しないようにします。だから私はこれをします

para[1][0]=numpy.matrix([[1,1]])

最初のインデックスはリストの 2 番目の行列を指し、2 番目のインデックスはその行列の最初の行を指し、[1,1] に置き換えます。

しかし、奇妙なことに、このコマンドは、リスト内の 10 個すべての行列の最初の行を、私が望んでいた 2 番目の行ではなく [1,1] に変更します。何を与える?

4

1 に答える 1

5

最初のリストに 10 を掛けると、実際には同じ基になる構造への参照である 10 個の numpy 配列のリストになります。実際には numpy 配列は 10 ではなく 1 つしかないため、1 つを変更するとすべてが変更されます。

証拠が必要な場合は、REPL で次の例を確認してください。

>>> a = numpy.zeros(10)
>>> a = [numpy.zeros(10)]*10
>>> a[0] is a[1]
True
>>> 

isオペレーターは、両方のオブジェクトが実際に同じかどうかをチェックします (値が等しいかどうかではありません) 。

あなたがすべきことは、次のように、乗算の代わりにリスト内包表記を使用して初期配列を生成することです。

para=[numpy.matrix(numpy.zeros((2,2))) for i in range(10)]

numpy.matrix()これにより、1 回ではなく 10 回呼び出され、10 個の異なるマトリックスが生成されます。

于 2013-02-23T22:37:09.063 に答える