查找第一个np.nan值的位置的最有效方法是什么?

查找第一个np.nan值的位置的最有效方法是什么?,第1张

查找第一个np.nan值的位置的最有效方法是什么?

我提名

a.argmax()

带有

@fuglede's
测试数组:

In [1]: a = np.array([np.nan if i % 10000 == 9999 else 3 for i in range(100000)])In [2]: np.isnan(a).argmax()Out[2]: 9999In [3]: np.argmax(a)Out[3]: 9999In [4]: a.argmax()Out[4]: 9999In [5]: timeit a.argmax()The slowest run took 29.94 ....10000 loops, best of 3: 20.3 µs per loopIn [6]: timeit np.isnan(a).argmax()The slowest run took 7.82 ...1000 loops, best of 3: 462 µs per loop

我尚未

numba
安装,因此可以进行比较。但是我的相对加速比
short
@fuglede's
6倍以上。

我正在Py3中接受测试

<np.nan
,而Py2则发出运行时警告。但是代码搜索表明这不依赖于该比较。

/numpy/core/src/multiarray/calculation.c

PyArray_ArgMax
与轴一起玩(将感兴趣的一个移动到最后),并将动作委派给
arg_func =PyArray_DESCR(ap)->f->argmax
,该函数取决于dtype。

numpy/core/src/multiarray/arraytypes.c.src
它看起来像
BOOL_argmax
短路,一旦遇到一回
True

for (; i < n; i++) {    if (ip[i]) {        *max_ind = i;        return 0;    }}

并且

@fname@_argmax
最大短路
nan
np.nan
也是“最大”
argmin

#if @isfloat@    if (@isnan@(mp)) {                return 0;    }#endif

c
欢迎经验丰富的编码人员发表评论,但在我看来,至少对于
np.nan
argmax
您会以最快的速度平原。

9999
in生成
a
表明
a.argmax
时间取决于该值,与短路一致。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5653652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存