1

プログラムをテストするために、ランダムな対称行列を作成しようとしました。データが対称的である限り、データはまったく気にしません (十分なランダム性はまったく問題ではありません)。

私の最初の試みはこれでした:

x=np.random.random((100,100))
x+=x.T

ただし、np.all(x==x.T)False を返します。 print x==x.T収量

array([[ True,  True,  True, ..., False, False, False],
   [ True,  True,  True, ..., False, False, False],
   [ True,  True,  True, ..., False, False, False],
   ..., 
   [False, False, False, ...,  True,  True,  True],
   [False, False, False, ...,  True,  True,  True],
   [False, False, False, ...,  True,  True,  True]], dtype=bool)

何が起こっているかを確認するために n=10 で小さなテスト例を実行しようとしましたが、その例は期待どおりに機能します。

代わりに次のようにすると:

x=np.random.random((100,100))
x=x+x.T

その後、問題なく動作します。

何が起きてる?これらのステートメントは意味的に同等ではありませんか? 違いは何ですか?

4

1 に答える 1

2

これらのステートメントは意味的に同等ではありません。 元の配列のビューx.Tを返します。この場合、実際には の値を繰り返しながら変更しています (これにより の値が変更されます)。 +=xx.T

このように考えてください...アルゴリズムが index(3,4)に到達すると、疑似コードで次のようになります。

x[3,4] = x[3,4] + x[4,3]

今、あなたの反復が に達したとき(4,3)、あなたはそうします

x[4,3] = x[4,3] + x[3,4]

しかし、x[3,4]反復を開始したときとは異なります。


2 番目のケースでは、実際に新しい (空の) 配列を作成し、空の配列の要素を変更します (決して に書き込みませんx)。したがって、擬似コードは次のようになります。

y[3,4] = x[3,4] + x[4,3]

y[4,3] = x[4,3] + x[3,4]

これは明らかに対称行列 ( y.

于 2013-06-13T15:46:13.103 に答える