如何numpy.nan * 0 = 0

时间:2017-03-24 09:53:01

标签: python numpy nan

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

这可能吗?

非常感谢

2 个答案:

答案 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]]