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

ora*_*nge 3 python arrays numpy

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

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

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

将nan替换为零,使用有限数字替换inf.

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

nansum任意算术运算一样的函数会很棒.

ali*_*i_m 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)
Run Code Online (Sandbox Code Playgroud)

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

result = np.where(np.isnan(a), 0, a * b)
Run Code Online (Sandbox Code Playgroud)

如果必须对包含NaN的数组执行多个操作,则可以考虑使用掩码数组,这些数组提供了处理缺失值或无效值的更通用方法:

masked_a = np.ma.masked_invalid(a)

result2 = masked_a * b
Run Code Online (Sandbox Code Playgroud)

在这里,result2是另一种np.ma.masked_array.mask属性是根据在NaN值均设置a.要将np.ndarray屏蔽值替换为0 来将其转换回法线,您可以使用该.filled()方法,传入您选择的填充值:

result_filled = result2.filled(0)

assert np.all(result_filled == result)
Run Code Online (Sandbox Code Playgroud)

  • 语法是`np.where(condition,val_where_true,val_where_false)`.在你的例子中,你希望你的结果数组的值为0,其中`s`等于NaN,而`s*p`只要`s`不等于NaN.因此:`np.where(np.isnan(s),0,s*p)`. (2认同)