在所有行中交换numpy数组的列,但第一行

时间:2017-12-04 23:08:27

标签: python arrays numpy slice

给定一个numpy数组

import numpy as np
a = np.arange(4*7).reshape([4, 7])

array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12, 13],
       [14, 15, 16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25, 26, 27]])

我可以通过以下方式应用切片来交换第二列和第三列:

a[:, [0, 2, 1, 3, 4, 5, 6]]

array([[ 0,  2,  1,  3,  4,  5,  6],
       [ 7,  9,  8, 10, 11, 12, 13],
       [14, 16, 15, 17, 18, 19, 20],
       [21, 23, 22, 24, 25, 26, 27]])

但是,我可以使用切片来交换所有行的第二列和第三列,但是第一列呢?预期的输出是:

array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7,  9,  8, 10, 11, 12, 13],
       [14, 16, 15, 17, 18, 19, 20],
       [21, 23, 22, 24, 25, 26, 27]])

1 个答案:

答案 0 :(得分:0)

对于in-situ编辑,我们可以在切出两列后使用翻转 -

a[1:,1:3] = a[1:,2:0:-1]

示例运行 -

In [556]: a = np.arange(4*7).reshape([4, 7])

In [557]: a
Out[557]: 
array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12, 13],
       [14, 15, 16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25, 26, 27]])

In [559]: a[1:,1:3] = a[1:,2:0:-1]

In [560]: a
Out[560]: 
array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7,  9,  8, 10, 11, 12, 13],
       [14, 16, 15, 17, 18, 19, 20],
       [21, 23, 22, 24, 25, 26, 27]])

对于两步分开的列,请使用2的步长分配(LHS)和-2来选择(RHS)。因此,对于列ID 1& 3 -

In [577]: a = np.arange(4*7).reshape([4, 7])

In [578]: a
Out[578]: 
array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12, 13],
       [14, 15, 16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25, 26, 27]])

In [579]: a[1:,1:4:2] = a[1:,3:0:-2]

In [580]: a
Out[580]: 
array([[ 0,  1,  2,  3,  4,  5,  6],
       [ 7, 10,  9,  8, 11, 12, 13],
       [14, 17, 16, 15, 18, 19, 20],
       [21, 24, 23, 22, 25, 26, 27]])

另一种方法是使用显式列编号索引 -

a[1:,[1,2]] = a[1:,[2,1]]

请注意,这会创建一个a[1:,[2,1]]的副本,因此内存效率会低于第一种方法。