我能够使用numpy
在我的程序中优化一些操作。当我描述一个运行时,我注意到大部分时间花在numpy.nan_to_num
上。我想进一步改善这一点。
发生的计算类型是两个数组的乘法,其中一个数组可以包含nan
个值。我希望将这些视为零,但是我不能用零初始化数组,因为nan
后来有意义并且不能设置为0.有没有办法做将nan
视为零的乘法(和加法)?
从nan_to_num
文档字符串中,我可以看到生成一个新数组,这可以解释为什么它需要这么长时间。
用零和inf替换有限数字的nan。
返回一个数组或标量,用零替换非数字(NaN),...
像nansum
这样的函数用于任意算术运算会很棒。
答案 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)