2013-08-18 64 views
0

我有一個長度爲m的n個向量的數組。例如,對於n = 3的米= 2在numpy中創建外部產品的數組

x = array([[1, 2], [3, 4], [5,6]]) 

我想利用與本身的每個矢量的外積,然後將它們連接成正方形矩陣形狀的陣列(正,m,m)。因此,對於上述x我會得到

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

     [[ 9, 12], 
     [12, 16]], 

     [[25, 30], 
     [30, 36]]]) 

我可以用for圈像這樣

np.concatenate([np.outer(v, v) for v in x]).reshape(3, 2, 2) 

是否有一個numpy的表達,這是否不Python的for循環做到這一點?

紅利問題:由於外部產品是對稱的,因此我不需要使用乘法運算來計算它們。我可以從numpy獲得這種對稱性優化嗎?

回答

4

也許用einsum

>>> x = np.array([[1, 2], [3, 4], [5,6]]) 
>>> np.einsum('ij...,i...->ij...',x,x) 
array([[[ 1, 2], 
     [ 2, 4]], 

     [[ 9, 12], 
     [12, 16]], 

     [[25, 30], 
     [30, 36]]]) 
+1

通常我會把'...'向左:'np.einsum(」 ...我,...,J - > ... IJ」,X,X)' – seberg

0

我以前當我試圖做同樣的Theano下面的代碼片段:

def multiouter(A,B): 
'''Provided NxK (Theano) matrices A and B it returns a NxKxK tensor C with C[i,:,:]=A[i,:]*B[i,:].T''' 
return A.dimshuffle(0,1,'x')*B.dimshuffle(0,'x',1) 

做一個簡單明瞭轉換numpy的國債收益率

def multiouter(A,B): 
'''Provided NxK (Numpy) arrays A and B it returns a NxKxK tensor C with C[i,:,:]=A[i,:]*B[i,:].T''' 
return A[:,:,None]*B[:,None,:] 

我覺得我得到了靈感從另一個StackOverflow發佈,因此我不確定我能否獲得所有功勞。

注:索引與None相當於索引與np.newaxis和實例化一個新的軸與尺寸1.