Ответ 1
Это работает так, как вы намереваетесь:
a3[[0,1]] = a3[[1,0]]
Два отдельных назначения в назначении кортежа не буферизуются относительно eachother; одно происходит за другим, что приводит к перезаписи вашего наблюдения
В 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.
Это работает так, как вы намереваетесь:
a3[[0,1]] = a3[[1,0]]
Два отдельных назначения в назначении кортежа не буферизуются относительно eachother; одно происходит за другим, что приводит к перезаписи вашего наблюдения