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)