选择n列的每个备用组 - NumPy

时间:2016-07-13 09:26:25

标签: python arrays numpy

我想在numpy数组中选择n列的每第n组。这意味着我想要前n列,而不是n个下一列,n个下一列,而不是n个下一列等。

例如,使用以下数组和n=2

import numpy as np
arr = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])

我想得到:

[[1, 2, 5, 6, 9, 10],
 [11, 12, 15, 16, 19, 20]]

使用n=3

[[1, 2, 3, 7, 8, 9],
 [11, 12, 13, 17, 18, 19]]

使用n=1,我们只需使用arr[:,::2]语法,但n>1是否有类似内容?

1 个答案:

答案 0 :(得分:3)

您可以使用modulus创建从02n的斜坡,然后从每个此类斜坡中选择第一个n。因此,对于每个渐变,我们将首先n作为True并休息为False,以便为我们提供覆盖整个数组长度的布尔数组。然后,我们只需沿列使用boolean indexing来选择最终输出的有效列。因此,实现看起来像这样 -

arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]

逐步运行代码以提供更好的主意 -

In [43]: arr
Out[43]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])

In [44]: n = 3

In [45]: np.mod(np.arange(arr.shape[-1]),2*n)
Out[45]: array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3])

In [46]: np.mod(np.arange(arr.shape[-1]),2*n)<n
Out[46]: array([ True,True,True,False,False,False,True,True,True,False])

In [47]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[47]: 
array([[ 1,  2,  3,  7,  8,  9],
       [11, 12, 13, 17, 18, 19]])

示例在各种n -

中运行
In [29]: arr
Out[29]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])

In [30]: n = 1

In [31]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[31]: 
array([[ 1,  3,  5,  7,  9],
       [11, 13, 15, 17, 19]])

In [32]: n = 2

In [33]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[33]: 
array([[ 1,  2,  5,  6,  9, 10],
       [11, 12, 15, 16, 19, 20]])

In [34]: n = 3

In [35]: arr[:,np.mod(np.arange(arr.shape[-1]),2*n)<n]
Out[35]: 
array([[ 1,  2,  3,  7,  8,  9],
       [11, 12, 13, 17, 18, 19]])