Die meisten array-orientierten Sprachen wie APL oder J haben eine Form von verallgemeinerten inneren Produkten, die wie Standard-Matrix-Multiplikationen funktionieren können, aber beliebige Operationen anstelle der Standard-Operationen unterstützen. Zum Beispiel ist in J +/ . *
die Standard-Multiplikation-dann-Summe, aber Sie können z.B. <./ . +
, um eine add-then-min-Operation zu erhalten (z. B. zum inkrementellen Aktualisieren der Länge des kürzesten Pfads durch ein Diagramm).
In langsamem und nur in 2D gehaltenem Python wäre dies etwa wie folgt:
%Vor% Bietet numpy
etwas, das dieses Muster direkt unterstützt?
Sie können mit dem Schneiden dorthin gelangen. Wir können die beiden Argumente so umformen, dass eine Operation gesendet wird, statt elementweise ausgeführt zu werden, und dann eine reduzierende Operation entlang der unerwünschten Achse ausgeführt wird.
%Vor%Ich würde zögern, es ein "verallgemeinertes inneres Produkt" zu nennen, weil innere Produkte eine spezifische mathematische Struktur haben, die dieser neuen Version fehlt.
Das funktioniert im Grunde so, dass numpy.newaxis
eine Länge von 1 hat und gesendet wird, also:
Gibt uns:
%Vor%Oder wenn es Ihnen hilft, es zu verstehen (ich empfinde es manchmal als etwas verwirrend),
%Vor% Das nicht so langsame numpy
-Äquivalent ist g(x,y.T)
, wobei Broadcasting verwendet wird, gefolgt von f(..., axis=1)
.
ähnlich für das Maximum der Summen:
%Vor% Es besteht potentielle Verwirrung in np.add
, np.multiply
, np.maximum
sind ufunc
, während np.sum
, np.prod
, np.max
nicht sind, sondern einen axis
-Parameter und keepdims
. (Bearbeiten: np.add.reduce
ist das ufunc
Äquivalent von np.sum
.)
Es gab eine alte Verbesserungsanforderung, um diese Art von Dingen in np.einsum
zu implementieren. Dies implementiert eine sum of products
-Berechnung mit einem hohen Maß an Kontrolle über die Indizierung. Es könnte also konzeptuell max of sums
mit der gleichen Indexierungssteuerung ausführen. Aber soweit ich weiß, hat niemand versucht, es umzusetzen.
Dieses verallgemeinerte innere Produkt war ein süßes Merkmal von APL (es war meine Hauptsprache vor einigen Jahrzehnten). Aber anscheinend nicht so nützlich, dass es aus dieser Sprachfamilie migriert ist. MATLAB hat so etwas nicht.
Gibt es irgendetwas, dass APL & amp; J kann mit diesem Konstrukt machen, das kann nicht in numpy
mit Art der Sendung getan werden, die wir demonstriert haben?
Bei allgemeineren x
und y
Formen muss ich newaxis
hinzufügen, wie in der anderen Antwort
Verallgemeinerung auf 3d, während die matmul
Idee des letzten Dim / 2. letzten von matmul
:
Während also numpy
(und MATLAB) keine spezielle Syntax wie APL
haben, ist die Idee einer Expansionsoperation (outter) gefolgt von einer Reduktion häufig genug.
testet andere ufunc
: