Обмен столбцов с массивами NumPy
Когда у меня есть a=1
а также b=2
, Я могу написать a,b=b,a
чтобы a
а также b
взаимозаменяемы.
Я использую эту матрицу в качестве массива:
[ 1, 2, 0, -2]
[ 0, 0, 1, 2]
[ 0, 0, 0, 0]
Замена столбцов в массиве numpy не работает:
import numpy as np
x = np.array([[ 1, 2, 0, -2],
[ 0, 0, 1, 2],
[ 0, 0, 0, 0]])
x[:,1], x[:,2] = x[:,2], x[:,1]
Это дает:
[ 1, 0, 0, -2]
[ 0, 1, 1, 2]
[ 0, 0, 0, 0]
Так x[:,1]
был просто перезаписан и не передан x[:,2]
,
Почему это так?
2 ответа
Если вы пытаетесь поменять столбцы, вы можете сделать это
print x
x[:,[2,1]] = x[:,[1,2]]
print x
выход
[[ 1 2 0 -2]
[ 0 0 1 2]
[ 0 0 0 0]]
[[ 1 0 2 -2]
[ 0 1 0 2]
[ 0 0 0 0]]
Метод обмена, который вы упомянули в вопросе, похоже, работает для одномерных массивов и списков, хотя,
x = np.array([1,2,0,-2])
print x
x[2], x[1] = x[1], x[2]
print x
выход
[ 1 2 0 -2]
[ 1 0 2 -2]
Когда вы используете x[:] = y[:]
синтаксис с пустым массивом, значения y копируются непосредственно в x; Временные работы не производятся. Итак, когда вы делаете x[:, 1], x[:,2] = x[:, 2], x[:, 1]
сначала третий столбец x копируется непосредственно во второй столбец, а затем второй столбец копируется непосредственно в третий.
Второй столбец уже перезаписан значениями третьего столбца к тому времени, когда вы копируете второй столбец в третий, так что вы получите исходные значения в третьем столбце.
Numpy разработан, чтобы по возможности избегать копий, чтобы улучшить производительность. Важно понимать, что list[:]
возвращает копию списка, в то время как np.array[:]
возвращает представление массива numpy.
Если вам нужно поменять местами m-ю и n-ю строки, вы можете использовать следующий код:
temp = a[m,:].copy()
a[m,:] = a[n,:]
a[n,:] = temp
вы можете экстраполировать ту же концепцию перестановки столбцов, изменив индексы.
Можете ли вы попробовать что-то вроде:
arr = np.arange(10).reshape(5,2)
arr[:, [1,0]]
array([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])
Очень простым решением было бы использовать свапы
x = x.swapaxes(1,2)