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))
有效,但请注意这只是一个视图,不是副本。