我如何 select 两个 numpy 索引的范围?

How do I select a range of two numpy indices?

我有一个简单的 numpy 数组,我想制作一个单独的数组,每两个索引取每两个元素

例如:

x = np.arange(0,20)

print(x)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

我的目标是得到一个数组

[2 3 6 7 10 11 14 15 18 19]

我该怎么做?我试过这个:

print(x[1:len(x)-1:2])

[ 1  3  5  7  9 11 13 15 17]

但我只得到所有其他索引。

你可以这样做:

print([x[i] for i in range(len(x)) if not(((i - 2) % 4) and ((i - 3) % 4))])

您可以使用取模 % 来查找每组四个中的后两个元素:

>>> x[np.isin(x % 4, [2,3])]

array([ 2,  3,  6,  7, 10, 11, 14, 15, 18, 19])

如果您的元素不是 range(因此它们的值不等于它们的索引),您可以采用新的 arange:

>>> x = x[::-1] # reverse x
>>> x[np.isin(np.arange(len(x)) % 4, [2,3])]

array([17, 16, 13, 12,  9,  8,  5,  4,  1,  0])

您可以简单地使用传统的 start:stop:step 约定来完成此操作,无需任何模数,方法是重塑数组、索引,然后将其展平。试试这个 -

  1. 通过将其重塑为 (-1,2) 您可以创建二元语法序列
  2. 那你就直接从1开始第2步
  3. 最后你把它压平了。
x.reshape(-1,2)[1::2].flatten()
array([ 2,  3,  6,  7, 10, 11, 14, 15, 18, 19])

这应该比使用数学运算来检查每个值的方法快得多,因为这只是重塑和索引。

您只需执行此操作即可在一行中获取这些数字:

print([x[i] for i in range(len(x-2)) if (i+2)%4==0 or (i+1)%4==0])