Numpy:在不使用nan_to_num的情况下乘以NaN值

时间:2015-03-19 04:13:41

标签: python arrays numpy

我能够使用numpy在我的程序中优化一些操作。当我描述一个运行时,我注意到大部分时间花在numpy.nan_to_num上。我想进一步改善这一点。

发生的计算类型是两个数组的乘法,其中一个数组可以包含nan个值。我希望将这些视为零,但是我不能用零初始化数组,因为nan后来有意义并且不能设置为0.有没有办法做将nan视为零的乘法(和加法)?

nan_to_num文档字符串中,我可以看到生成一个新数组,这可以解释为什么它需要这么长时间。

  

用零和inf替换有限数字的nan。

     

返回一个数组或标量,用零替换非数字(NaN),...

nansum这样的函数用于任意算术运算会很棒。

1 个答案:

答案 0 :(得分:7)

以下是一些示例数据:

import numpy as np

a = np.random.rand(1000, 1000)
a[a < 0.1] = np.nan    # set some random values to nan
b = np.ones_like(a)

一个选项是使用np.where将结果的值设置为0,只要其中一个数组等于NaN:

result = np.where(np.isnan(a), 0, a * b)

如果必须对包含NaN的数组执行多项操作,可以考虑使用masked arrays,它提供了处理缺失值或无效值的更通用方法:

masked_a = np.ma.masked_invalid(a)

result2 = masked_a * b

此处,result2是另一个np.ma.masked_array,其.mask属性是根据NaN值在a中的位置设置的。要将屏蔽值替换为0,将其转换回正常np.ndarray,您可以使用.filled()方法,传入您选择的填充值:

result_filled = result2.filled(0)

assert np.all(result_filled == result)