Python 使用NumPy数组交换列

Python 使用NumPy数组交换列,python,arrays,numpy,iterable-unpacking,Python,Arrays,Numpy,Iterable Unpacking,当我有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[:,

当我有
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]


为什么会出现这种情况?

如果您试图交换列,可以通过

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]]
[ 1  2  0 -2] 
[ 1  0  2 -2]
您在问题中提到的交换方法似乎适用于一维数组和列表

x =  np.array([1,2,0,-2])
print x
x[2], x[1] = x[1], x[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]]
[ 1  2  0 -2] 
[ 1  0  2 -2]

当对numpy数组使用
x[:]=y[:]
语法时,y的值直接复制到x中;不制作临时文件。因此,当您执行
x[:,1],x[:,2]=x[:,2],x[:,1]
时,首先将x的第三列直接复制到第二列,然后将第二列直接复制到第三列

在将第二列复制到第三列时,第二列的值已被第三列的值覆盖,因此第三列中的原始值将结束


Numpy旨在尽可能避免复制,以提高性能。重要的是要了解
list[:]
返回列表的副本,而
np.array[:]
返回一个副本。

您可以尝试如下操作吗:

arr = np.arange(10).reshape(5,2)

arr[:, [1,0]]

array([[1, 0],
       [3, 2],
       [5, 4],
       [7, 6],
       [9, 8]])

一个非常简单的解决方案是使用Swapax

x = x.swapaxes(1,2)

如果需要交换第m行和第n行,可以使用以下代码:

temp = a[m,:].copy()
a[m,:]  = a[n,:]
a[n,:] =  temp

您可以通过更改索引来推断交换列的相同概念。

好问题。它与常规列表一样工作,例如
d=[0,1,2,3];d[:2],d[2:]=d[2:],d[:2]
产生
[2,3,0,1]
错误,这不会交换列,这是一种“排序”换位
arr=np.arange(10)。重塑(5,2)打印(np.array_equal(arr.swapaxes(0,1),arr.T))
有效,但请注意这只是一个视图,不是副本。