我想让python制作产品
numpy.nan*0
返回0(而不是nan),但是例如
numpy.nan*4
仍然回归。
我的申请:我有一些numpy矩阵,我相互成倍增加。这些包含许多nan条目和大量零。
nans总是代表未知的,但是有限值,当与零相乘时,已知它们变为零。
所以我想在以下示例中A*B
返回[1,nan],[nan,1]
:
import numpy as np
A=np.matrix('1 0; 0 1')
B=np.matrix([[1, np.nan],[np.nan, 1]])
这可能吗?
非常感谢
答案 0 :(得分:2)
您可以使用numpy函数numpy.nan_to_num()
import numpy as np
A = np.matrix('1 0; 0 1')
B = np.matrix([[1, np.nan],[np.nan, 1]])
C = np.nan_to_num(A) * np.nan_to_num(B)
结果将是[[1., 0.], [0., 1.]]
。
答案 1 :(得分:0)
我认为不可能直接覆盖numpy中nan * 0
的行为,因为该乘法是在非常低的水平上执行的。
但是,您可以为自己的Python类提供所需的乘法行为,但要注意:这会严重影响性能。
import numpy as np
class MyNumber(float):
def __mul__(self, other):
if other == 0 and np.isnan(self) or self == 0 and np.isnan(other):
return 0.0
return float(self) * other
def convert(x):
x = np.asmatrix(x, dtype=object) # use Python objects as matrix elements
x.flat = [MyNumber(i) for i in x.flat] # convert each element to MyNumber
return x
A = convert([[1, 0], [0, 1]])
B = convert([[1, np.nan], [np.nan, 1]])
print(A * B)
# [[1.0 nan]
# [nan 1.0]]