Numpy:获取索引大于值且条件为tru的数组

2024-06-16 13:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数组:

a = np.array([6,5,4,3,4,5,6])

现在我想得到所有大于4但索引值大于2的元素。 我发现的方法如下:

a[2:][a[2:]>4]

有没有更好或更可读的方法来实现这一点?你知道吗

更新: 这是一个简化版本。实际上,索引是通过对以下几个变量进行算术运算完成的:

a[len(trainPredict)+(look_back*2)+1:][a[len(trainPredict)+(look_back*2)+1:]>4]

trainPredict是一个numpy数组,look_back是一个整数。
我想看看是否有一个既定的方式或其他人如何做到这一点。你知道吗


Tags: 方法版本numpy元素lennp方式back
2条回答

@AlexanderCécile's answer不仅比您发布的一行代码更清晰,而且还消除了临时数组的冗余计算。尽管如此,它似乎并不比您原来的方法快。你知道吗

下面的计时都是在初始设置为

import numpy as np
np.random.seed(0xDEADBEEF)
a = np.random.randint(8, size=N)

N在1e3到1e8之间变化,系数为10。我尝试了四种不同的代码:

  1. 编码教皇:result = a[2:][a[2:] > 4]
  2. 亚历山大·塞西尔:s = a[2:]; result = s[s > 4]
  3. mad1:result = a[np.flatnonzero(a[2:]) + 2]
  4. mad2:result = a[(a > 4) & (np.arange(a.size) >= 2)]

在所有情况下,都是通过在命令行上运行

python -m timeit -s 'import numpy as np; np.random.seed(0xDEADBEEF); a = np.random.randint(8, size=N)' '<X>'

这里,N是3到8之间的10的幂,而<X>是上面的表达式之一。时间安排如下:

enter image description here

方法#1和#2几乎无法区分。令人惊讶的是,在~5e3到~1e6个元素之间,方法#3似乎稍微快了一点,但明显快了很多。我通常不会从花哨的索引中想到这一点。方法4当然是最慢的。你知道吗

以下是完整的数据:

           CodePope  AlexanderCécile  MadPhysicist1  MadPhysicist2
1000       3.77e-06         3.69e-06       5.48e-06       6.52e-06
10000       4.6e-05         4.59e-05       3.97e-05       5.93e-05
100000     0.000484         0.000483         0.0004       0.000592
1000000     0.00513          0.00515        0.00503        0.00675
10000000     0.0529           0.0525         0.0617          0.102
100000000     0.657            0.658          0.782           1.09

如果您担心切片的复杂性和/或条件的数量,您可以随时将它们分开:

a = np.array([6,5,4,3,4,5,6])

a_slice = a[2:]

cond_1 = a_slice > 4

res = a_slice[cond_1]

你的例子很简单吗?对于更复杂的操作,可能有更好的解决方案。你知道吗

相关问题 更多 >