2016-11-19 2 views
0

Wenn ich zu Arrays X (X hat n Zeilen und k Spalten) und Y (Y hat n Zeilen und q Spalten) wie multipliziere ich die beiden in der Vektorform, so dass ich Array Z erhalten mit folgenden Eigenschaften:Python numpy array Multiplikation

Z[0]=X[:,0]*Y 
Z[1]=X[:,1]*Y 
Z[2]=X[:,2]*Y 
... 
Z[K-1]=X[:,k-1]*Y 
Z[K]=X[:,k]*Y 

for c in range(X.shape[1]): 
    Z[c]=X[:,c].dot(Y) 
+1

Was ist das dauern endgültige Form von 'Z'? (k,)? (k, q)? Summierst du über die 'n' Größe? Details bitte. Vielleicht ist es sogar ein kleines 2x3x4 Beispiel, also sind wir sicher, dass wir Sie verstehen. – hpaulj

+0

endgültige Form von Z ist (k, q). Ich werde versuchen, die Loop-Version in Kürze zu veröffentlichen, wenn das helfen könnte. – 1nsg

+0

Bitte beachten Sie die oben hinzugefügte Loop-Version. – 1nsg

Antwort

2

Aus Ihrer Beschreibung, und fast kein Denken:

Z=np.einsum('nk,nq->kq',X,Y) 

konnte ich es auch mit np.dot, mit einem transponieren oder zwei schreiben. np.dot ist die Matrix Summe der letzten dim des 1. und 2.

der zweiten
Z = np.dot(X.T, Y) 

=================

In [566]: n,k,q=2,3,4 
In [567]: X=np.arange(n*k).reshape(n,k) 
In [568]: Y=np.arange(n*q).reshape(n,q) 
In [569]: Z=np.einsum('nk,nq->kq',X,Y) 
In [570]: Z 
Out[570]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]]) 
In [571]: Z1=np.empty((k,q)) 
In [572]: Z1=np.array([X[:,c].dot(Y) for c in range(k)]) 
In [573]: Z1 
Out[573]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]]) 
In [574]: X.T.dot(Y) 
Out[574]: 
array([[12, 15, 18, 21], 
     [16, 21, 26, 31], 
     [20, 27, 34, 41]])