在numpy数组中交换列?

from numpy import * def swap_columns(my_array, col1, col2): temp = my_array[:,col1] my_array[:,col1] = my_array[:,col2] my_array[:,col2] = temp 

然后

 swap_columns(data, 0, 1) 

不起作用。 但是,直接调用代码

 temp = my_array[:,0] my_array[:,0] = my_array[:,1] my_array[:,1] = temp 

请问。 为什么会发生这种情况,我该如何解决? 该错误说:“IndexError:0-D数组只能使用单个()或一个列表(和一个单一的…)作为索引”,这意味着参数不是整数? 我已经尝试将cols转换为int,但是没有解决它。

这里有两个问题。 首先,你传递给你函数的data显然不是一个二维的NumPy数组 – 至less这是错误信息所说的。

第二个问题是代码没有达到你的期望:

 my_array = numpy.arange(9).reshape(3, 3) # array([[0, 1, 2], # [3, 4, 5], # [6, 7, 8]]) temp = my_array[:, 0] my_array[:, 0] = my_array[:, 1] my_array[:, 1] = temp # array([[1, 1, 2], # [4, 4, 5], # [7, 7, 8]]) 

问题是Numpy 基本切片不会创build实际数据的副本,而是创build相同数据的视图。 要做到这一点,你必须明确地复制

 temp = numpy.copy(my_array[:, 0]) my_array[:, 0] = my_array[:, 1] my_array[:, 1] = temp 

或使用高级切片

 my_array[:,[0, 1]] = my_array[:,[1, 0]] 

我发现以下最快的:

 my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy() 

时间分析:

 import numpy as np my_array = np.arange(900).reshape(30, 30) 

如下:

 %timeit my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy() The slowest run took 15.05 times longer than the fastest. This could mean that an intermediate result is being cached 1000000 loops, best of 3: 1.72 µs per loop 

先进的切片时间是:

 %timeit my_array[:,[0, 1]] = my_array[:,[1, 0]] The slowest run took 7.38 times longer than the fastest. This could mean that an intermediate result is being cached 100000 loops, best of 3: 6.9 µs per loop 

build立@Sven的回答:

 import numpy as np my_array = np.arange(9).reshape(3, 3) print my_array [[0 1 2] [3 4 5] [6 7 8]] def swap_cols(arr, frm, to): arr[:,[frm, to]] = arr[:,[to, frm]] swap_cols(my_array, 0, 1) print my_array [[1 0 2] [4 3 5] [7 6 8]] def swap_rows(arr, frm, to): arr[[frm, to],:] = arr[[to, frm],:] my_array = np.arange(9).reshape(3, 3) swap_rows(my_array, 0, 2) print my_array [[6 7 8] [3 4 5] [0 1 2]]