In [303]: X=np.array([[1,5],[5,9],[4,1]])
In [304]: X
Out[304]:
array([[1, 5],
[5, 9],
[4, 1]])
In [305]: np.inner(X,X)
Out[305]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [306]: np.dot(X,X.T)
Out[306]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
維基外鏈接主要是關於向量會談,一維數組。你的X
是2d。
In [310]: x=np.arange(3)
In [311]: np.outer(x,x)
Out[311]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
In [312]: np.inner(x,x)
Out[312]: 5
In [313]: np.dot(x,x) # same as inner
Out[313]: 5
In [314]: x[:,None]*x[None,:] # same as outer
Out[314]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
請注意,Wiki外部不涉及求和。 Inner在此示例中爲5
是外部的3個對角線值的總和。
dot
也涉及求和 - 所有產品都遵循特定軸上的求和。
一些wiki外層方程使用顯式索引。 einsum
函數可以實現這些計算。
In [325]: np.einsum('ij,kj->ik',X,X)
Out[325]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [326]: np.einsum('ij,jk->ik',X,X.T)
Out[326]:
array([[ 26, 50, 9],
[ 50, 106, 29],
[ 9, 29, 17]])
In [327]: np.einsum('i,j->ij',x,x)
Out[327]:
array([[0, 0, 0],
[0, 1, 2],
[0, 2, 4]])
In [328]: np.einsum('i,i->',x,x)
Out[328]: 5
如在評論中提及,np.outer
使用ravel
,例如
return a.ravel()[:, newaxis]*b.ravel()[newaxis,:]
這與我之前爲x
演示的廣播乘法相同。
你對內在和點/轉置之間關係的理解似乎是正確的。你用什麼數據爲'X'?對於簡單的向量和數組,我變爲True。 – wim
感謝您的驗證!剛編輯我的問題以包含輸入數據。 – Selah
對我而言,它仍然返回True –