gpt4 book ai didi

python - 在 NumPy 中快速检查 NaN

转载 作者:IT老高 更新时间:2023-10-28 21:07:12 25 4
gpt4 key购买 nike

我正在寻找检查 NumPy 数组 X 中是否出现 NaN (np.nan) 的最快方法。 np.isnan(X) 是不可能的,因为它构建了一个形状为 X.shape 的 bool 数组,这可能是巨大的。

我尝试了 np.nan in X,但这似乎不起作用,因为 np.nan != np.nan。有没有一种快速且节省内存的方法来做到这一点?

(对于那些会问“多么庞大”的人:我说不出来。这是库代码的输入验证。)

最佳答案

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

In [13]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 244 us per loop

In [14]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 97.3 us per loop

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

edit 上面的测试是在数组中间使用单个 NaN 执行的。

有趣的是,min 在存在 NaN 时比不存在时慢。随着 NaN 越来越接近数组的开头,它似乎也变慢了。另一方面,无论是否存在 NaN 以及它们位于何处,sum 的吞吐量似乎都是恒定的:

In [40]: x = np.random.rand(100000)

In [41]: %timeit np.isnan(np.min(x))
10000 loops, best of 3: 153 us per loop

In [42]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop

In [43]: x[50000] = np.nan

In [44]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 239 us per loop

In [45]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.8 us per loop

In [46]: x[0] = np.nan

In [47]: %timeit np.isnan(np.min(x))
1000 loops, best of 3: 326 us per loop

In [48]: %timeit np.isnan(np.sum(x))
10000 loops, best of 3: 95.9 us per loop

关于python - 在 NumPy 中快速检查 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6736590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com