Python Numpy:与NaN值相乘,而不使用NaN_to_num

Python Numpy:与NaN值相乘,而不使用NaN_to_num,python,arrays,numpy,Python,Arrays,Numpy,我使用numpy对程序中的一些操作进行了优化。当我分析一次跑步时,我注意到大部分时间都花在numpy.nan\u to_num上。我想进一步改进这一点 发生的计算类型是两个数组的乘法,其中一个数组可能包含nan值。我希望这些被视为零,但我不能用零初始化数组,因为nan稍后有意义,不能设置为0。有没有一种方法可以将nan作为零进行乘法(和加法) 从nan_to_numdocstring中,我可以看到一个新的数组产生了,这可能解释了为什么需要这么长时间 将nan替换为零,将inf替换为有限数 返回一

我使用
numpy
对程序中的一些操作进行了优化。当我分析一次跑步时,我注意到大部分时间都花在
numpy.nan\u to_num
上。我想进一步改进这一点

发生的计算类型是两个数组的乘法,其中一个数组可能包含
nan
值。我希望这些被视为零,但我不能用零初始化数组,因为
nan
稍后有意义,不能设置为0。有没有一种方法可以将
nan
作为零进行乘法(和加法)

nan_to_num
docstring中,我可以看到一个新的数组产生了,这可能解释了为什么需要这么长时间

将nan替换为零,将inf替换为有限数

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


类似于任意算术运算的函数将非常有用。

以下是一些示例数据:

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)

如果必须对包含NANS的数组进行多个操作,您可以考虑使用,它提供了一种处理丢失或无效值的更通用的方法:

masked_a = np.ma.masked_invalid(a)

result2 = masked_a * b
这里,
result2
是另一个
np.ma.masked_数组
,它的
.mask
属性是根据NaN值在
a
中的位置设置的。要将其转换回正常的
np.ndarray
,并将屏蔽值替换为0,您可以使用
.filled()
方法,传入您选择的填充值:

result_filled = result2.filled(0)

assert np.all(result_filled == result)

这个
屏蔽的\u无效的
和随后的
填充的
方法实际上需要比
nan\u到\u num
更长的时间(至少在我的用例中是这样)。好的,那么使用
np怎么样呢?你能给出一个真实的测试用例吗?是的。忘了提了。这实际上效果很好(而且速度更快)。您是否愿意详细介绍一下
np。您的上下文中
的作用是什么?我有一个构造,比如
(p*np.nan\u to_num(s)).sum(axis=3,out=p)
,并试图将其转换为
p=np。其中(s,0,s*p).sum(axis=3)
,但这似乎没有给出相同的结果。我的转换正确吗?语法是
np.where(条件,val\u where\u true,val\u where\u false)
。在您的示例中,如果
s
等于NaN,
s*p
如果
s
不等于NaN,则希望生成的数组的值为0。因此:
np.where(np.isnan(s),0,s*p)
result_filled = result2.filled(0)

assert np.all(result_filled == result)