2011-09-16 101 views
3

如何在沒有迴路的情況下計算此產品?我想我需要使用numpy.tensordot,但我似乎無法正確設置它。這裏的循環版本:Numpy產品或張量產品問題

import numpy as np 
a = np.random.rand(5,5,3,3) 
b = np.random.rand(5,5,3,3) 

c = np.zeros(a.shape[:2]) 
for i in range(c.shape[0]): 
    for j in range(c.shape[1]): 
     c[i,j] = np.sum(a[i,j,:,:] * b[i,j,:,:]) 

(結果是形狀(5,5)的numpy的陣列c

+1

測試的東西隨機會輕鬆很多,每個人都可以使用相同的。 – Benjamin

回答

3

我已經失去了陰謀。答案是如果你設置種子只需

c = a * b 
c = np.sum(c,axis=3) 
c = np.sum(c,axis=2) 

或在一行

c = np.sum(np.sum(a*b,axis=2),axis=2) 
0

願這幫助你的語法?

>>> from numpy import * 
>>> a = arange(60.).reshape(3,4,5) 
>>> b = arange(24.).reshape(4,3,2) 
>>> c = tensordot(a,b, axes=([1,0],[0,1]))  # sum over the 1st and 2nd dimensions 
>>> c.shape 
(5,2) 
>>> # A slower but equivalent way of computing the same: 
>>> c = zeros((5,2)) 
>>> for i in range(5): 
... for j in range(2): 
...  for k in range(3): 
...  for n in range(4): 
...   c[i,j] += a[k,n,i] * b[n,k,j] 
... 

(從http://www.scipy.org/Numpy_Example_List#head-a46c9c520bd7a7b43e0ff166c01b57ec76eb96c7