Vektoroperationen mit numpy

Ich habe drei numpy Arrays:

X: eine 3073 x 49000 Matrix
W: eine 10 x 3073 Matrix
y: ein 49000 x 1 Vektor

y enthält Werte zwischen 0 und 9, jeder Wert steht für eine Zeile inW.

Ich möchte die erste Spalte von @ hinzufügX zur Zeile inW gegeben durch das erste Element iny. Das heißt wenn das erste Element iny ist 3, füge die erste Spalte von @ hinX bis zur vierten Reihe vonW. Und dann die zweite Spalte von @ hinzufügX zur Zeile inW gegeben durch das zweite Element iny und so weiter, bis alle Spalten vonX wurde in die Zeile in @ eingefüW spezifiziert durchy, dh insgesamt 49000 hinzugefügte Zeilen.

W[y] += X.T funktioniert bei mir nicht, da dies einer Zeile in @ nicht mehr als einen Vektor hinzufüW.

Bitte beachten Si: Ich suche nur nach vectorized Lösungen. Das heißt Keine for-Schleifen.

BEARBEITEN Zur Verdeutlichung füge ich unten ein Beispiel mit kleinen Matrixgrößen hinzu, die dem Beispiel von Salvador Dali entsprechen.

In [1]: import numpy as np

In [2]: a, b, c = 3, 4, 5

In [3]: np.random.seed(0)

In [4]: X = np.random.randint(10, size=(b,c))

In [5]: W = np.random.randint(10, size=(a,b))

In [6]: y = np.random.randint(a, size=(c,1))

In [7]: X
Out[7]: 
array([[5, 0, 3, 3, 7],
       [9, 3, 5, 2, 4],
       [7, 6, 8, 8, 1],
       [6, 7, 7, 8, 1]])

In [8]: W
Out[8]: 
array([[5, 9, 8, 9],
       [4, 3, 0, 3],
       [5, 0, 2, 3]])

In [9]: y
Out[9]: 
array([[0],
       [1],
       [1],
       [2],
       [0]])

In [10]: W[y.ravel()] + X.T
Out[10]: 
array([[10, 18, 15, 15],
       [ 4,  6,  6, 10],
       [ 7,  8,  8, 10],
       [ 8,  2, 10, 11],
       [12, 13,  9, 10]])

In [11]: W[y.ravel()] = W[y.ravel()] + X.T

In [12]: W
Out[12]: 
array([[12, 13,  9, 10],
       [ 7,  8,  8, 10],
       [ 8,  2, 10, 11]])

Das Problem ist, @ zu bekommBEID Spalte 0 und Spalte 4 in X werden zu Zeile 0 in W hinzugefügt, sowie Spalte 1 und 2 in X werden zu Zeile 1 in W hinzugefügt.

Das gewünschte Ergebnis ist also:

W = [[17, 22, 16, 16],
     [ 7, 11, 14, 17],
     [ 8,  2, 10, 11]]

Antworten auf die Frage(8)

Ihre Antwort auf die Frage