2016-11-30 160 views
-2

我有beta=np.array([[1],[4],[0]])一個載體,當我使用np.log用這個載體,我得到這個:numpy的點積返回NaN,MATLAB相當於不返回NaN的

>>> 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。

回答

1

向量的第三個分量涉及所有矩陣行的產品。無限次數零是不確定的。與大多數語言一樣,Python聲明不是數字。

0

什麼的

[[1 0 0] [[0] 
[0 1 0] * [1.38629436] 
[0 0 1]] [-inf]] 

的第一個元素?那麼,這是1*0 + 0*1.38629436 + 0*-inf。看到最後一部分?

0*-inf

所有線性代數的那些漂亮的定理直行窗外,如果你開始試圖把無窮你的矩陣。哎呀,這些定理只能用有限的浮點數來保持,因爲浮點數和浮點算術只能逼近實數和實數算術。

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