私は標準的な方法を使用して、NumPy で Python で対称行列/配列を作成しています。
x = rand(500,500)
x = (x+x.T)
all(x==x.T)
> True
さあ賢くやってみましょう:
x = rand(500,500)
x += x.T
all(x==x.T)
> False
ちょっと待って、何?
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)
左上と右下のセグメントは対称です。もっと小さい配列を選択した場合はどうなりますか?
x = rand(50,50)
x += x.T
all(x==x.T)
> True
わかりました....
x = rand(90,90)
x += x.T
all(x==x.T)
> True
x = rand(91,91)
x += x.T
all(x==x.T)
> False
念のため...
x = rand(91,91)
x = (x+x.T)
all(x==x.T)
> True
これはバグでしょうか、それとも+=
NumPy 配列に関して何かおかしなことを学ぼうとしているのでしょうか?
ベストアンサー1
のtranspose
手術を返すビュー配列の、つまり新しい配列は割り当てられないことを意味します。つまり、配列の読み取りと変更を同時に行っていることになります。結果の一部のサイズや一部の領域が機能する理由を特定することは困難ですが、おそらく NumPy が配列の追加 (サブマトリックスのコピーを作成する可能性があります) や配列のビュー (サイズが小さい場合は新しい配列を作成する可能性があります) を処理する方法に関係しています。
もちろん、x = x + x.T
新しい配列を作成して に割り当てるので、この操作は機能します。x