0 * 无穷大是未定义的,这就是为什么当你做A.dot(b) 时你会得到[nan, nan, nan, nan]。
矩阵和向量的点积只是它们的元素乘积,在第二个轴上求和。所以,
A=np.array([[0, 0, 1, 2], [1, 2, 0, 0], [0, 1, 2, 0], [1, 0, 2, 0]])
b=np.array([1, -np.inf, 1, -np.inf])
X = A * b
print(X)
这给了我们:
array([[ 0., nan, 1., -inf],
[ 1., -inf, 0., nan],
[ 0., -inf, 2., nan],
[ 1., nan, 2., nan]])
现在,我们知道nan 的值是0 与np.inf 相乘的结果。所以,我们可以用0替换它们。
X[np.isnan(X)] = 0
print(X)
输出:
array([[ 0., 0., 1., -inf],
[ 1., -inf, 0., 0.],
[ 0., -inf, 2., 0.],
[ 1., 0., 2., 0.]])
最后,在第二个轴上求和
result = X.sum(axis=1)
print(result)
输出:
array([-inf, -inf, -inf, 3.])
作为单个函数:
def dotinf(A, b):
X = A * b
X[np.isnan(X)] = 0
return X.sum(axis=1)
P=np.array([[0, 0, 1, 2], [1, 2, 0, 0], [0, 1, 2, 0], [1, 0, 2, 0]])
q=np.array([1, -np.inf, 1, -np.inf])
r = dotinf(P, q)