当我有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]
。
为什么会这样?
答案 0 :(得分:13)
当您将x[:] = y[:]
语法与numpy数组一起使用时,y的值将直接复制到x;没有临时工。因此,当您执行x[:, 1], x[:,2] = x[:, 2], x[:, 1]
时,首先将x的第三列直接复制到第二列,然后将第二列直接复制到第三列。
在将第二列复制到第三列时,第二列已被第三列值覆盖,因此您最终得到第三列中的原始值。
Numpy旨在尽可能避免复制,以提高性能。了解list[:]
返回列表副本非常重要,而np.array[:]
会返回view of the numpy array。
答案 1 :(得分:8)
如果您尝试交换列,可以通过
进行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]
答案 2 :(得分:1)
如果您需要交换第m行和第n行,则可以执行以下代码:
temp = a[m,:].copy()
a[m,:] = a[n,:]
a[n,:] = temp
您可以通过更改索引来推断用于交换列的相同概念。
答案 3 :(得分:0)
您可以尝试以下方法吗?
arr = np.arange(10).reshape(5,2)
arr[:, [1,0]]
array([[1, 0],
[3, 2],
[5, 4],
[7, 6],
[9, 8]])
答案 4 :(得分:0)
一个非常简单的解决方案是使用交换轴
x = x.swapaxes(1,2)