NumPy中的NaN快速检查

我正在寻找最快的方法来检查NumPy数组X中NaN(np.NaN)的出现情况np.isnan(X)是不可能的,因为它构建了一个shapeX.shape的布尔数组,这可能是巨大的

我在X中尝试了np.nan,但似乎不起作用,因为np.nan!=np.nan。有没有一种快速高效的方法可以做到这一点

(对于那些会问“有多大”的人:我不知道。这是库代码的输入验证。)

雷的解决方案很好。但是,在我的机器上,使用numpy.sum代替numpy.min大约快2.5倍:

[13]on

:%timeit np.isnan(np.min(x))
1000圈,最好3圈:每圈244美元
At[14]on:%timeit np.isnan(np.sum(x))
10000个回路,最好的3个:每个回路97.3 us

min不同,sum不需要分支,这在现代硬件上往往非常昂贵。这可能就是sum更快的原因

编辑以上测试是在数组中间用一个NANN执行的。

有趣的是,有NAN时,min比没有NAN时慢。随着NAN距离阵列的起点越来越近,速度似乎也越来越慢。另一方面,sum的吞吐量似乎是恒定的,无论是否存在NAN以及它们位于何处:

[40]on

:x=np.rand.rand(100000)
At[41]on:%timeit np.isnan(np.min(x))
10000圈,最好的3圈:每圈153美元
At[42]on:%timeit np.isnan(np.sum(x))
10000圈,最好3圈:每圈95.9美元
In[43]:x[50000]=np.nan
At[44]on:%timeit np.isnan(np.min(x))
1000圈,最好的3圈:每圈239美元
At[45]on:%timeit np.isnan(np.sum(x))
10000个回路,最好为3:95.8 us/回路
In[46]:x[0]=np.nan
At[47]on:%timeit np.isnan(np.min(x))
1000个回路,最好为3:326 us/回路
At[48]on:%timeit np.isnan(np.sum(x))
10000圈,最好3圈:每圈95.9美元

发表评论