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