Обмен строк в Numpy

В Python я могу обменивать две переменные с помощью множественной аффектации; он также работает со списками:

l1,l2=[1,2,3],[4,5,6]
l1,l2=l2,l1
print(l1,l2)
>>> [4, 5, 6] [1, 2, 3]

Но когда я хочу обменивать 2 строки массива numpy (например, в алгоритме Гаусса), он терпит неудачу:

import numpy as np
a3=np.array([[1,2,3],[4,5,6]])
print(a3)
a3[0,:],a3[1,:]=a3[1,:],a3[0,:]
print(a3)
>>> [[1 2 3]
     [4 5 6]]
    [[4 5 6]
     [4 5 6]]

Я думал, что по какой-то странной причине эти два столбца теперь указывают на те же самые значения; но это не так, поскольку a3[0,0]=5 после предыдущих строк изменяет a3 [0,0], но не a3 [1,0].

Я нашел, как это сделать: например, a3[0,:],a3[1,:]=a3[1,:].copy(),a3[0,:].copy() работает. Но может ли кто-нибудь объяснить, почему обмен с несколькими аффектами терпит неудачу с numpy-строками? Мои вопросы касаются основной работы Python и Numpy.

Ответ 1

Это работает так, как вы намереваетесь:

a3[[0,1]] = a3[[1,0]]

Два отдельных назначения в назначении кортежа не буферизуются относительно eachother; одно происходит за другим, что приводит к перезаписи вашего наблюдения