我有一个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。
答案 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]])