查找第一个np.nan值的位置的最有效方法是什么?
考虑数组 a
a = np.array([3, 3, np.nan, 3, 3, np.nan])
我可以做
np.isnan(a).argmax()
但这需要找到所有对象np.nan
才可以找到第一个。
有没有更有效的方法?
我一直在试图找出我是否可以传递参数np.argpartition
,从而np.nan
获取的第一个分类,而不是最后一次。
编辑关于[dup]。
有几个原因使这个问题不同。
- 该问题和答案涉及价值观的平等。这是关于
isnan
。 - 这些答案都遭受我的答案面临的同一问题。注意,我提供了一个完全有效的答案,但强调了它的效率低下。我正在寻找解决效率低下的问题。
编辑有关第二个[dup]。
仍然要解决平等问题,而问题/答案却是古老的,很可能已经过时了。
-
我提名
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]: 9999 In [3]: np.argmax(a) Out[3]: 9999 In [4]: a.argmax() Out[4]: 9999 In [5]: timeit a.argmax() The slowest run took 29.94 .... 10000 loops, best of 3: 20.3 µs per loop In [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)) { /* nan encountered; it's maximal */ return 0; } #endif
c
欢迎经验丰富的编码人员发表评论,但在我看来,至少对于np.nan
,argmax
您会以最快的速度平原。玩
9999
in生成a
表明a.argmax
时间取决于该值,与短路一致。