我如何 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,2) 您可以创建二元语法序列
- 那你就直接从1开始第2步
- 最后你把它压平了。
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])
我有一个简单的 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,2) 您可以创建二元语法序列
- 那你就直接从1开始第2步
- 最后你把它压平了。
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])