2016-05-26 14 views
0

Ich habe zwei numpy Arrays:Schnelle äußere Tensorprodukt in numpy

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

Ich mag würde die äußere Tensorprodukt bilden, dh die numpy Array

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

so dass

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

Ich muss die obige äußere Multiplikation mehrmals durchführen, also möchte ich das so schnell wie möglich beschleunigen.

+0

Einfügen Dummy-Daten mit Ihrem erwarteten Ergebnis besser zu verstehen, was meinst du –

Antwort

2

Eine Alternative zu outer ist explizit auf die Dimensionen zu erweitern. Für 1D-Arrays würden diese

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

für 10x10-Arrays sein, und die Dimension Expansion verallgemeinern, bekomme ich die gleichen Zeiten

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 

So outer einige Codierung tut speichern, aber die grundlegende ausgestrahlt Multiplikation ist die gleiche .

4

Sie wollen np.multiply.outer:

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

Das ist es! Darf ich annehmen, dass, da ufunc Teil von numpy ist, es C-Code aufruft und es keinen wesentlich schnelleren Weg gibt, dies zu tun? – fact