Python numpy点积返回NaN,Matlab等价物不返回NaN

Python numpy点积返回NaN,Matlab等价物不返回NaN,python,numpy,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)

我有一个向量
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也一样。有什么想法吗


编辑:我知道基本线性代数的人,谢谢你。我的实际问题是设法为点积找到一个numpy等价物,它与Matlab的点积做相同的事情,在相同的情况下,它不返回NaN。

向量的第三个分量包含在所有矩阵行的积中。无穷乘以零是不确定的。与大多数语言一样,Python声明这不是一个数字

第一个元素是什么

[[1 0 0]    [[0]
 [0 1 0]  *  [1.38629436]
 [0 0 1]]    [-inf]]
??嗯,它是
1*0+0*1.38629436+0*-inf
。看到最后一部分了吗

0*-inf

如果你开始尝试在你的矩阵中加入无穷大,那么所有这些线性代数的好定理都会直接消失。见鬼,这些定理只适用于有限浮点数,因为浮点数和浮点数运算只能近似实数和实数运算。

点涉及将“所有”值相乘,并将一个轴求和。这个点的等价物是

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]])