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

Python 选择n列的每个备用组-NumPy,python,arrays,numpy,Python,Arrays,Numpy,我想选择numpy数组中n列的每n组。这意味着我想要的是前n列,而不是下n列,下n列,而不是下n列等等 例如,使用以下数组且n=2: 我想得到: [[1, 2, 5, 6, 9, 10], [11, 12, 15, 16, 19, 20]] n=3时: 对于n=1,我们可以简单地使用语法arr[:,::2],但是对于n>1有类似的东西吗?您可以使用创建从0到2n的渐变,然后从每个渐变中选择第一个n。因此,对于每个渐变,我们将使第一个n为True,其余为False,从而得到一个覆盖整个数组长度

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

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

我想得到:

[[1, 2, 5, 6, 9, 10],
 [11, 12, 15, 16, 19, 20]]
n=3时:

对于n=1,我们可以简单地使用语法arr[:,::2],但是对于n>1有类似的东西吗?

您可以使用创建从0到2n的渐变,然后从每个渐变中选择第一个n。因此,对于每个渐变,我们将使第一个n为True,其余为False,从而得到一个覆盖整个数组长度的布尔数组。然后,我们只需沿着列选择最终输出的有效列。因此,实现看起来是这样的-

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

非常感谢。有一个小问题,为什么要使用arr.shape[-1]而不是arr.shape[1]?Jean BaptisteMartin我想我脑子里有一个通用的ndarray,所以它可以用于任何维度的数组来选择列,而列总是最后一个维度。也许值得注意的是,为了达到预期的效果,几乎所有其他方法都会创建一个新的数组来复制数据,而不是原始数组的视图。@Divakar好的,谢谢您的详细回答!
[[1, 2, 3, 7, 8, 9],
 [11, 12, 13, 17, 18, 19]]
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]])
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]])