2017-08-15 40 views
-3

例如,我有形狀的矢量[1,d]我怎樣做矢量乘法在批次與Python

如果d = 4

v = np.array([[1, 2, 3, 4]]) # shape = [1,4] 

和做

np.dot(v.T,v) 

結果將是

Out[80]: 
array([[ 1, 2, 3, 4], 
     [ 2, 4, 6, 8], 
     [ 3, 6, 9, 12], 
     [ 4, 8, 12, 16]]) 

現在我有很多vect ORS,他們是在[N,d]

這N個矢量與d尺寸的形狀

我怎樣才能獲得結果的最有效的方式

PS:其結果將是一個numpy.ndarray的形狀[N,D,D]

+0

你可以舉一個'[[1,2],[1,2]]'輸出結果的例子嗎? –

+0

array([[[1,2],[2,4]],[[4,2],[2,1]])) –

+1

'np.einsum'和'np.matmul'可以處理這個問題。其實這是外部產品,所以你不需要這些。廣播可以處理它。 – hpaulj

回答

1
In [758]: v = np.array([[1, 2, 3, 4]]) 
In [759]: v2 = np.vstack([v,v]) 
In [760]: v2.shape 
Out[760]: (2, 4) 
In [761]: v2[:,None,:]*v2[:,:,None] 
Out[761]: 
array([[[ 1, 2, 3, 4], 
     [ 2, 4, 6, 8], 
     [ 3, 6, 9, 12], 
     [ 4, 8, 12, 16]], 

     [[ 1, 2, 3, 4], 
     [ 2, 4, 6, 8], 
     [ 3, 6, 9, 12], 
     [ 4, 8, 12, 16]]]) 
In [762]: _.shape 
Out[762]: (2, 4, 4) 

我使用廣播來構造外部產品。

覈對您的評論例如

In [763]: x2= np.array([[1, 2], [1, 2]]) 
In [764]: x2[:,None,:]*x2[:,:,None] 
Out[764]: 
array([[[1, 2], 
     [2, 4]], 

     [[1, 2], 
     [2, 4]]]) 

你想:

In [765]: np.array([[[1, 2], [2, 4]],[[4, 2],[2, 1]]]) 
Out[765]: 
array([[[1, 2], 
     [2, 4]], 

     [[4, 2], 
     [2, 1]]]) 

的數字是有,但第二面翻轉。那真的是你想要的嗎?顯然,維度映射的方式有些不明確。如果這真的是你想要的,請解釋你將如何迭代。


einsum隨着該外產物是

In [770]: np.einsum('ij,ik->ijk', x2,x2) 
Out[770]: 
array([[[1, 2], 
     [2, 4]], 

     [[1, 2], 
     [2, 4]]]) 

隨着matmul表達式爲:v2[:,:,None]@v2[:,None,:]

+0

感謝兄弟,這正是我需要的。 –