使用NumPy数组交换列

16

当我有a=1b=2时,我可以编写a,b=b,a以交换ab

我将这个矩阵用作数组:

   [ 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
好问题。它在常规列表中按预期工作,例如 d = [0,1,2,3]; d[:2], d[2:] = d[2:], d[:2] 产生 [2, 3, 0, 1] - tobias_k
5个回答

31

如果您想交换列,可以通过

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]

15
当你使用numpy数组中的x[:] = y[:]语法时,y的值会直接被复制到x中;没有临时变量。所以当你执行x[:, 1], x[:,2] = x[:, 2], x[:, 1]的操作时,首先将x的第三列直接复制到第二列,然后将第二列直接复制到第三列。
由于在将第二列复制到第三列之前,第三列已经被第二列的值覆盖,因此最终得到的是第三列中的原始值。
Numpy旨在尽可能避免复制,以提高性能。重要的是要理解list[:]返回列表的副本,而np.array[:]返回numpy数组的视图

1
如果你需要交换第m行和第n行,你可以使用以下代码:
temp = a[m,:].copy()
a[m,:]  = a[n,:]
a[n,:] =  temp

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

0

你可以尝试类似这样的东西:

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

arr[:, [1,0]]

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

工作正常,但请注意这只是一个视图,而不是副本。 - Alberto Chiusole

-1
一个非常简单的解决方案是使用swapaxes。
x = x.swapaxes(1,2)

2
错误,这并没有交换,它“有点像”转置。print(np.array_equal(arr.swapaxes(0, 1), arr.T))``` - Alberto Chiusole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接