numpy dot产品返回NaN,Matlab等效不返回NaN

时间:2016-11-30 21:17:48

标签: python numpy

我有一个beta=np.array([[1],[4],[0]])的向量,当我使用np.log这个向量时,我得到了这个:

>>> np.log(beta)
array([[ 0.        ],
       [ 1.38629436],
       [       -inf]])

但是当我使用np.dot beta和身份矩阵时,它会将{NaN而不是1.38629436作为[1,0]的元素。

>>> np.dot(np.eye(3),np.log(beta))
array([[ nan],
       [ nan],
       [-inf]])

我也试过这个:

>>> beta2 = np.log(beta)
>>> beta2
array([[ 0.        ],
       [ 1.38629436],
       [       -inf]])
>>> np.dot(np.eye(3),beta2)
array([[ nan],
       [ nan],
       [-inf]])

相同乘法的Matlab版本不返回NaN。我想在numpy中拥有相同的东西。有什么想法吗?

编辑:我知道基本的线性代数人们对此表示感谢。我的实际问题是设法使用与Matlab相同的点积的numpy等价物,在同样的情况下它不会返回NaN。

3 个答案:

答案 0 :(得分:1)

矢量的第3个分量涉及具有矩阵行的所有产品。无穷大零是不确定的。与大多数语言一样,Python声明它不是数字。

答案 1 :(得分:0)

的第一个要素是什么
[[1 0 0]    [[0]
 [0 1 0]  *  [1.38629436]
 [0 0 1]]    [-inf]]

?好吧,它是1*0 + 0*1.38629436 + 0*-inf。看到最后一部分?

0*-inf

如果你开始尝试在你的矩阵中加入无穷大,那么所有线性代数的好定理都会直接从窗口出来。哎呀,那些定理只能用有限浮点数近似,因为浮点数和浮点算术只能逼近实数和实数算法。

答案 2 :(得分:0)

dot涉及倍增所有'值,并将一个轴相加。与此点相当的是

np.einsum('ij,jk->ik`, np.eye(3), np.log(beta))

可以通过广播进行评估:

In [223]: np.eye(3)[:,:,None]*np.log(beta)[None,:,:]
Out[223]: 
array([[[ 0.        ],
        [ 0.        ],
        [        nan]],

       [[ 0.        ],
        [ 1.38629436],
        [        nan]],

       [[ 0.        ],
        [ 0.        ],
        [       -inf]]])
In [224]: (np.eye(3)[:,:,None]*np.log(beta)[None,:,:]).sum(axis=1)
Out[224]: 
array([[ nan],
       [ nan],
       [-inf]])

所以第一个nan来自求和[0,0,nan]

In [226]: 0*np.log(beta)
Out[226]: 
array([[  0.],
       [  0.],
       [ nan]])