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次迭代。
谢谢
数组的长度是窗口大小的倍数-
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)