Liefert numpy ein verallgemeinertes inneres Produkt?

8

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?

    
llasram 10.02.2017, 23:44
quelle

2 Antworten

4

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:

%Vor%

Gibt uns:

%Vor%

Oder wenn es Ihnen hilft, es zu verstehen (ich empfinde es manchmal als etwas verwirrend),

%Vor%     
Dietrich Epp 11.02.2017, 00:46
quelle
4

Das nicht so langsame numpy -Äquivalent ist g(x,y.T) , wobei Broadcasting verwendet wird, gefolgt von f(..., axis=1) .

%Vor%

ä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 .)

%Vor%

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

angegeben %Vor%

Verallgemeinerung auf 3d, während die matmul Idee des letzten Dim / 2. letzten von matmul :

verwendet wird %Vor%

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 :

%Vor%     
hpaulj 11.02.2017 00:47
quelle

Tags und Links