使用NumPy数组交换列

时间:2014-07-01 10:06:25

标签: python arrays numpy iterable-unpacking

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

为什么会这样?

5 个答案:

答案 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)