numpy subtrahieren/hinzufügen, 1d-Arrays aus 2d-Arrays
Ich habe folgende 2D-array:
a = array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]])
und anderen 1D-array:
b = array([ 1, 2, 3, 4, 5])
dann möchte ich berechnen, so etwas wie
c = a - b
mit der Absicht, immer:
c = array([[0, 1, 2],
[2, 3, 4],
[4, 5, 6],
[6, 7, 8],
[8, 9, 10]])
aber stattdessen bekomme ich die Fehlermeldung:
Traceback (most recent call last):
Python Shell, prompt 79, line 1
ValueError: operands could not be broadcast together with shapes (5,3) (5,)
Ich lese den Rundfunk Regeln, aber nicht klüger. Ich könnte einen workaround mit for-Schleifen oder ähnliches, aber es sollte eine direkte Art und Weise. Dank
- Tun
a - b[:,None]
odera - b[:,np.newaxis]
,, das wird konvertierenb
zu einem 2D-array durch das hinzufügen einer dimension zu tun, und dann die Subtraktion. - sollten Sie eine Antwort aus Ihrem Kommentar.
- Ist das nicht eine grundlegende Frage, wie dieser gedeckt werden, bevor auf
SO
? Dup-hammer? 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie konvertieren array
b to a (2, 1) shape
array, so verwenden SieNone or numpy.newaxis
im index-Tupel. Hier ist die Die Indizierung von Numpy array.Kann man das so machen:
Ausgabe:
A.shape = (100,1)
undB.shape = (100)
und wenn ichA-B
bekomme ichC
Form(100,100
. Was ist Los?Als Divakar angegeben in den Kommentaren, fügen Sie einfach eine neue Achse zu
b
.Ich schlage vor, Sie Lesen Sie mehr über Rundfunk das ist sehr oft nützlich, um zu Vektorisieren Berechnungen in numpy: interessanterweise
a.transpose() - b
würde nicht angehoben haben, ist ein Fehler (man bräuchte, um die Umsetzung des Ergebnisses wieder um Ihre gewünschte Ausgabe).In diesem computaion, die erste Reihe ist in Ihrer Form
(3, 5)
, undb.shape
ist (5,). Also die Formb
entspricht den Schwanz der Forma
und Rundfunk passieren kann. Ist dies nicht der Fall, wenn die Form des ersten Arrays ist(5, 3)
, daher die Fehlermeldung, die Sie erhalten.Hier sind einige Laufzeit-tests zum Vergleich der Geschwindigkeiten der vorgeschlagenen Antworten, mit der Sie Ihre Werte für
a
undb
: Sie können sehen, dass die Unterschiede nicht wirklich signifikanta.transpose() - b
anderen erfordern würde transponieren, um die gewünschte Ausgabe erhalten, richtig?a - b[None].T
? Schnelle Laufzeit-tests zeigen dies marginal besser als[:,None]
und war ich nicht erwartet. Aber stellen Sie sicher, testen Sie es auf Ihr Ende, wenn Sie die Laufzeit-tests, aber definitiv Wert heraus überprüfen!Ist manchmal nützlich, dies zu tun: