同時割り当てを使用してNumpy配列の列を交換しようとすると、予期しない動作が発生します。
A = arange(12).reshape(3,4)
print(A)
# prints [[ 0 1 2 3] Ok
# [ 4 5 6 7]
# [ 8 9 10 11]]
A[:,0], A[:,1] = A[:,1], A[:,0]
print(A)
# prints [[ 1 1 2 3] Not what intended (swap)
# [ 5 5 6 7]
# [ 9 9 10 11]]
予想される動作:RHS上のアレイの「ビュー」が両方とも評価され、次に、RHSビューのコンテンツを新しい場所に「コピー」するLHS上のターゲットオブジェクトによって割り当てが実行されます。私は、次の理由により、スライス間の割り当てでコピーが作成されると主張します。
A = arange(12).reshape(3,4)
A[:,0] = A[:,1]
A[:,1] = array([99,99,99])
print A[:,0]
# prints: [1 5 9]
実際に何が起こるか:スライスの同時割り当てでは、ndarrayは、RHSとLHSのさまざまな用語を「一度に1つずつ」評価して割り当てます。最初A[:,0] = A[:,1]
に、次にA[:,1] = A[:,0]
。
これは、ndarrayクラスが標準のPythonの方法とは異なる方法で同時割り当てをカスタマイズしているためですか?