Nehmen wir an, ich habe eine Matrix X (1000x10)
und eine Matrix Y (20x10)
. Ich möchte effizient Y
zu jedem (20x10)
Block von X
wiederholt hinzufügen (daher 50 Blöcke). Gibt es eine effiziente Möglichkeit, dies mit Numpy zu tun? Ich möchte nicht np.repeat
verwenden, da die ursprünglichen Matrizen riesig sind und ich unnötige Vervielfältigung von Y
verhindern möchte. Irgendwelche Ideen?Numpy fügen Sie eine Matrix zu Scheiben einer anderen Matrix
Antwort
Sie argument list unpacking nutzen können, NumPy broadcasting und the fact that ndarray.reshape()
returns a view die Operation auszuführen:
tmp = X.reshape(-1, *Y.shape)
tmp += Y
keine zusätzlichen Daten zugeordnet werden und nach diesen Operationen X
enthält das Ergebnis der Operation.
Sie können np.tile
verwenden, um „zu erweitern“ (genauer gesagt, Kachel) die kleinere Array die Größe des größeren Arrays entsprechen, zum Beispiel
x = np.zeros([1000,10])
y = np.ones([20,10])
new_x = x + np.tile(y,(50,1))
Dieses eine temporäre große Array im Speicher erstellen wird fügen Sie zu x
hinzu, aber wird sofort weggeworfen, also hängt es von Ihrer Gedächtniskapazität und der Größe des Feldes ab, aber ich glaube, dass es das in Bezug auf CPU-Verbrauch und Lesbarkeit am leistungsfähigsten ist. Die andere Möglichkeit besteht natürlich darin, über das größere Array zu schleifen und das kleinere Array auf jedes Teil davon zu übertragen (in diesem Fall 50 Mal), aber es wird in Bezug auf die CPU zeitaufwendiger und weniger effizient sein, aber es wird im Gedächtnis leichter sein.
Ein Beispiel für die zweite Option:
for i in range(0,len(x),20):
x[i:i+20,:] = y
- 1. Subsetting einer NumPy-Matrix mit einer anderen Matrix
- 2. Verwendung leerer Matrix als Index einer anderen Matrix in numpy
- 3. numpy, füllen Sparse Matrix mit Zeilen aus einer anderen Matrix
- 4. Wie Spalten zu einer großen numpy Matrix
- 5. Numpy Matrix zu Array
- 6. Fügen Sie eine Zeile zu einer Matrix in OpenCV
- 7. Zuweisen einer Matrix zu einer anderen Matrix in Java
- 8. Multiplizieren Sie jede Spalte einer Matrix mit einer anderen Matrix
- 9. Convert Datenrahmen zu einer numpy Matrix
- 10. Bedingungsnummer einer Matrix mit numpy
- 11. numpy Matrix zu Pandas Serie
- 12. Schleife durch eine numpy Matrix
- 13. Indizierung eine numpy 2D-Matrix
- 14. Numpy Covariance Matrix numpy.cov
- 15. Slicing 4D-Matrix in 2D-Scheiben MatLab
- 16. numpy/tensorflow Vektorisierung von Scheiben
- 17. Wie eine Matrix mit einer anderen Matrix in Scala aufzuteilen
- 18. Python numpy Matrix Multiplikation mit einer diagonalen Matrix
- 19. Ersetzen Sie eine Spalte in einer numpy Matrix
- 20. Numpy 3Darray Matrix Multiplikationsfunktion
- 21. numpy: wie eine Matrix von Vektoren, die aus Vektor-Matrix
- 22. numpy Matrix Multiplikation Formen
- 23. Numpy Matrix Multiplikation Verhalten
- 24. Extrahieren einer Zeile aus einer numpy Matrix
- 25. konvertieren Numpy Matrix Datenrahmen
- 26. Wie Scheiben einer 3D-Matrix Beibehaltung seiner Form
- 27. Python: Numpy Matrix split
- 28. Trans numpy Matrix
- 29. Matrix in die Mitte einer anderen Matrix in Python einfügen
- 30. Fügen Sie mehrere Kanäle zu einer 28x28x5000 Matrix hinzu
Der Unterschied besteht darin, dass die Berechnung von 'X.reshape() + Y' zuordnet und ein neues Array erstellt, während' tmp + = Y' die bereits zugewiesenen Werte ändert. Kein zusätzlicher RAM wird zugewiesen. Und die Ausgabe hat die richtige Form, da 'X' niemals seine Form ändert. –
Bekam es. Vielen Dank. –
Wow! Das sieht magisch für mich aus! wie funktioniert es? Kannst du erklären, was ist "Y.shape"? und warum 'X.reshape (-1, * Y.shape)' 'X' nicht in' tmp' kopiert? (Ist es wie ein Bezug auf 'X')? Vielen Dank! – Babak