在NumPy中建立索引:访问其他每组值

SLh*_*ark 3 python arrays numpy

[::n]numpy中的索引选项提供了一种非常有用的方式来索引列表中的第n个项目。但是,是否可以使用此功能提取多个值,例如,每隔两个

例如:

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Run Code Online (Sandbox Code Playgroud)

我想提取其他每对值,即我想返回

a[0, 1, 4, 5, 8, 9,]
Run Code Online (Sandbox Code Playgroud)

当然可以使用循环或其他方式来::建立索引,但是我想知道是否有一种更快的方法可以在numpy中使用-style索引,还可以指定模式的宽度以进行每n次迭代。

谢谢

Div*_*kar 5

数组的长度是窗口大小的倍数-

In [29]: W = 2 # window-size

In [30]: a.reshape(-1,W)[::2].ravel()
Out[30]: array([0, 1, 4, 5, 8, 9])
Run Code Online (Sandbox Code Playgroud)

分解步骤说明-

# Reshape to split into W-sized groups
In [43]: a.reshape(-1,W)
Out[43]: 
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

# Use stepsize to select every other pair starting from the first one
In [44]: a.reshape(-1,W)[::2]
Out[44]: 
array([[0, 1],
       [4, 5],
       [8, 9]])

# Flatten for desired output
In [45]: a.reshape(-1,W)[::2].ravel()
Out[45]: array([0, 1, 4, 5, 8, 9])
Run Code Online (Sandbox Code Playgroud)

如果您对2D输出没问题,请跳过最后一步,因为这仍然是输入的视图,并且在运行时实际上是免费的。让我们验证view-part-

In [47]: np.shares_memory(a,a.reshape(-1,W)[::2])
Out[47]: True
Run Code Online (Sandbox Code Playgroud)

对于不一定是倍数的一般情况,我们可以使用一个masking基于-

In [64]: a[(np.arange(len(a))%(2*W))<W]
Out[64]: array([0, 1, 4, 5, 8, 9])
Run Code Online (Sandbox Code Playgroud)