NumPy配列で+=を使用すると予期しない結果になる質問する

NumPy配列で+=を使用すると予期しない結果になる質問する

私は標準的な方法を使用して、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

おすすめ記事