Python 如何使用numpy.nan*0=0

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,

我想让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, 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]]