Angenommen, ich habe ein numpy-Array:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
und ich habe einen entsprechenden "Vektor:"
vector = np.array([1,2,3])
Wie bearbeite ich data
entlang jeder Zeile, um entweder zu subtrahieren oder zu dividieren, so dass das Ergebnis ist:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
Kurz gesagt: Wie führe ich eine Operation in jeder Zeile eines 2D-Arrays mit einem 1D-Array von Skalaren durch, die jeder Zeile entsprechen?
Bitte schön. Sie müssen nur None
(oder alternativ np.newaxis
) kombiniert mit Rundfunk:
In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
Wie bereits erwähnt, schneiden Sie mit None
oder mit np.newaxes
ist eine großartige Möglichkeit, dies zu tun. Eine andere Alternative ist die Verwendung von Transponierungen und Rundfunk wie in
(data.T - vector).T
und
(data.T / vector).T
Für höherdimensionale Arrays können Sie die Methode swapaxes
von NumPy-Arrays oder die Funktion NumPy rollaxis
verwenden. Es gibt wirklich viele Möglichkeiten, dies zu tun.
Eine ausführlichere Erklärung des Rundfunks finden Sie unter http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
Die Lösung von JoshAdel verwendet np.newaxis, um eine Dimension hinzuzufügen. Eine Alternative ist die Verwendung von reshape (), um die Abmessungen in Vorbereitung auf die Übertragung auszurichten .
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data
# array([[1, 1, 1],
# [2, 2, 2],
# [3, 3, 3]])
vector
# array([1, 2, 3])
data.shape
# (3, 3)
vector.shape
# (3,)
data / vector.reshape((3,1))
# array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])
Durch Ausführen der Umformung () können die Dimensionen für die Übertragung ausgerichtet werden:
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
Beachten Sie, dass data/vector
In Ordnung ist, Sie jedoch nicht die gewünschte Antwort erhalten. Es teilt jede Spalte von array
(anstelle jeder Zeile ) durch jedes entsprechende Element von vector
. Es ist das, was Sie erhalten würden, wenn Sie vector
explizit in 1x3
Anstelle von 3x1
Umgestalten würden.
data / vector
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
Wenn Sie zur Antwort von stackoverflowuser2010 hinzufügen, können Sie im Allgemeinen nur verwenden
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
Dies verwandelt deinen Vektor in ein column matrix/vector
. So können Sie die elementweisen Operationen nach Belieben ausführen. Zumindest für mich ist dies der intuitivste Weg, und da numpy (in den meisten Fällen) nur eine Ansicht desselben internen Speichers für die Umgestaltung verwendet, ist es auch effizient.
Der pythonische Weg dazu ist ...
np.divide(data,vector)
Dies kümmert sich um die Umformung und auch die Ergebnisse sind im Gleitkomma-Format. Bei anderen Antworten werden die Ergebnisse im gerundeten Ganzzahlformat angezeigt.
# HINWEIS: Keine der Spalten in Daten und Vektor sollte übereinstimmen