Python 如何使用numpy.nan*0=0
我想让python制作这个产品Python 如何使用numpy.nan*0=0,python,numpy,nan,Python,Numpy,Nan,我想让python制作这个产品 numpy.nan*0 返回0(而不是nan),但例如 numpy.nan*4 还是回楠 我的应用:我有一些numpy矩阵,我将它们彼此相乘。它们包含许多nan条目和大量的零。 NAN始终表示未知但有限的值,已知这些值在与零相乘时变为零。 因此,在下面的示例中,我希望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,
numpy.nan*0
返回0(而不是nan),但例如
numpy.nan*4
还是回楠
我的应用:我有一些numpy矩阵,我将它们彼此相乘。它们包含许多nan条目和大量的零。
NAN始终表示未知但有限的值,已知这些值在与零相乘时变为零。
因此,在下面的示例中,我希望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]])
这可能吗
非常感谢您可以使用numpy功能
结果将是
[[1,0.],[0,1.]
我认为不可能直接覆盖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]]
它必须为
numpy.nan*4
返回什么,即不是0的东西?我想要numpy.nan*4=nan
您是在寻找元素乘法还是矩阵乘法(涉及求和缩减的乘法)?“我选择了NaN来表示NaN以外的东西,并希望它在本机算术中表现不同”似乎是一个很高的要求。如果实际数字的范围受到合理限制,您可以选择远远超出它的某个值作为表示“有限但未知”的标记值,然后在乘法。你将无法知道你的未知值是什么,然而,在另一端,我认为这是练习的重点。
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]]