webentwicklung-frage-antwort-db.com.de

Numpy: Teilen Sie jede Zeile durch ein Vektorelement

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?

95
BFTM

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]])
150
JoshAdel

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

10
IanH

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.

0
meow

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

0
shantanu pathak