Я пытаюсь обменивать столбцы массива 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 оцениваются, а затем назначение выполняется целевым объектом LHS, "копируя" содержимое представлений RHS в новые местоположения. Я утверждаю, что копии выполняются в назначениях "slice-to-slice" из-за следующего:
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 "по одному": сначала A[:,0] = A[:,1]
, а затем A[:,1] = A[:,0]
.
Это связано с тем, что класс ndarray настраивает одновременные назначения в отличие от стандартного пути python?