numpy数组中求NaN忽略None的快速方法

bnl4lu3b  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个这样的数组:

array = np.random.randint(1, 100, 10000).astype(object)
array[[1, 2, 6, 83, 102, 545]] = np.nan
array[[3, 8, 70]] = None

现在,我想找到NaN项的索引,忽略None项,在这个例子中,我想得到[1, 2, 6, 83, 102, 545]项的索引,我可以用np.equalnp.isnan得到NaN项的索引:

np.isnan(array.astype(float)) & (~np.equal(array, None))

我使用% timeit检查了此解决方案的性能,得到了以下结果:

243 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

有更快的解决方案吗?

kh212irz

kh212irz1#

array != array

经典的NaN测试。编写这样的NaN测试是促使NaN!= NaN设计决策的原因之一,因为IEEE 754设计者无法假设程序员可以访问isnan例程。
当我尝试时,这明显优于问题中的代码:

In [1]: import numpy as np

In [2]: array = np.random.randint(1, 100, 10000).astype(object)
   ...: array[[1, 2, 6, 83, 102, 545]] = np.nan
   ...: array[[3, 8, 70]] = None

In [3]: %timeit array != array
139 µs ± 46.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

In [4]: %timeit np.isnan(array.astype(float)) & (~np.equal(array, None))
755 µs ± 123 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

当然,它的输出给予相同的:

In [5]: result1 = array != array

In [6]: result2 = np.isnan(array.astype(float)) & (~np.equal(array, None))

In [7]: np.array_equal(result1, result2)
Out[7]: True

相关问题