Обмен столбцов с массивами 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)
Другие вопросы по тегам