当前位置: 首页 > 面试题库 >

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

邵阳
2023-03-14
问题内容

考虑数组 a

a = np.array([3, 3, np.nan, 3, 3, np.nan])

我可以做

np.isnan(a).argmax()

但这需要找到所有对象np.nan才可以找到第一个。
有没有更有效的方法?

我一直在试图找出我是否可以传递参数np.argpartition,从而np.nan获取的第一个分类,而不是最后一次。

编辑关于[dup]。
有几个原因使这个问题不同。

  1. 该问题和答案涉及价值观的平等。这是关于isnan
  2. 这些答案都遭受我的答案面临的同一问题。注意,我提供了一个完全有效的答案,但强调了它的效率低下。我正在寻找解决效率低下的问题。

编辑有关第二个[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's6倍以上。

我正在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最大短路nannp.nan也是“最大” argmin

#if @isfloat@
    if (@isnan@(mp)) {
        /* nan encountered; it's maximal */
        return 0;
    }
#endif

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

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



 类似资料: