2016-05-26 41 views
0

我有兩個numpy的數組:快速外張量積

x of shape ((d1,...,d_m)) 
y of shape ((e_1,...e_n)) 

我想形成外張量積,即numpy的陣列

z of shape ((d1,...,d_m,e_1,...,e_n)) 

使得

z[i_1,...,i_n,i_{n+1}...,i_{m+n}] == x[i_1,...i_m]*y[i_{m+1},...,i_{m+n}] 

我必須多次執行上面的外部乘法運算,所以我想盡可能地加快這一點。

+0

插入虛擬數據與您的預期結果,更好地瞭解您的意思 –

回答

2

的替代outer是明確擴大尺寸。對於一維數組,這將是

x[:,None]*y # y[None,:] is automatic. 

爲10×10陣列,以及推廣維度擴展,我會得到相同的時間

In [74]: timeit x[[slice(None)]*x.ndim + [None]*y.ndim] * y 
10000 loops, best of 3: 53.6 µs per loop 

In [75]: timeit np.multiply.outer(x,y) 
10000 loops, best of 3: 52.6 µs per loop 

所以outer確實保存一些編碼,但基本廣播乘法是相同的。

4

你想np.multiply.outer

z = np.multiply.outer(x, y) 
+0

就是這樣!我是否有權假定,由於ufunc是numpy的一部分,因此它會調用C代碼,並且不會有更快的方法來執行此操作? – fact