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

发布于 2021-01-29 18:19:51

考虑数组 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]。

仍然要解决平等问题,而问题/答案却是古老的,很可能已经过时了。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我提名

    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时间取决于该值,与短路一致。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看