使用NumPy数组交换列

Xip*_*ias 8 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]
Run Code Online (Sandbox Code Playgroud)

交换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]
Run Code Online (Sandbox Code Playgroud)

它产生:

   [ 1,  0,  0, -2]
   [ 0,  1,  1,  2]
   [ 0,  0,  0,  0]
Run Code Online (Sandbox Code Playgroud)

所以x[:,1]简单地被覆盖而不是转移到x[:,2].

为什么会这样?

dus*_*yle 13

当您使用x[:] = y[:]带有numpy数组的语法时,y的值将直接复制到x; 没有临时工.因此,当您这样做时x[:, 1], x[:,2] = x[:, 2], x[:, 1],首先将x的第三列直接复制到第二列,然后将第二列直接复制到第三列.

在将第二列复制到第三列时,第二列已被第三列值覆盖,因此您最终得到第三列中的原始值.

Numpy旨在尽可能避免复制,以提高性能.重要的是要理解list[:]返回列表的副本,同时np.array[:]返回numpy数组视图.


Ash*_*lla 10

如果您正在尝试交换列,则可以执行此操作

print x
x[:,[2,1]] = x[:,[1,2]]
print x
Run Code Online (Sandbox Code Playgroud)

产量

[[ 1  2  0 -2]
 [ 0  0  1  2]
 [ 0  0  0  0]]
[[ 1  0  2 -2]
 [ 0  1  0  2]
 [ 0  0  0  0]]
Run Code Online (Sandbox Code Playgroud)

你在问题中提到的交换方法似乎适用于单维数组和列表,

x =  np.array([1,2,0,-2])
print x
x[2], x[1] = x[1], x[2]
print x
Run Code Online (Sandbox Code Playgroud)

产量

[ 1  2  0 -2] 
[ 1  0  2 -2]
Run Code Online (Sandbox Code Playgroud)