2017-06-27 2 views
0

Ich plante, Kollegen np.einsum zu unterrichten, in der Hoffnung zu zeigen, wie es auf Multiplikationen und Summierungen reduziert werden würde. Also, anstelle von numerischen Daten dachte ich, Alphabet Buchstaben zu verwenden. in den Arrays.Generierung np.einsum Auswertung Grafik

Angenommen, wir haben A (2X2) als [['a', 'b'], ['c', 'd']] und B (2X1) als [['e'], ['f ']] Wir könnten einsum verwenden, um eine Matrix C zu erstellen, sagen wir mal: np.einsum('ab , bc -> ac', A, B).

Was ich möchte, um zu sehen ist: es die Berechnung Graph zurück: so etwas wie: a * c + ... usw.

Ofcourse erwartet np.einsum numerischen Daten und würde einen Fehler geben, wenn angesichts der über Code zum Ausführen.

Antwort

1

tensordot hat ein Beispiel mit Strings für eines seiner Arrays, unter Ausnutzung der Tatsache, dass 'a'*3 => 'aaa'. Aber einsum kann nichts mit Strings tun (das ist ein kompiliertes Code-Problem).

Vor einiger Zeit schrieb ich eine reine Python-Arbeit, die die Zeichenfolge 'ij, jk->' analysiert und die entsprechende Berechnung der Summe der Produkte einrichtet. Dies beinhaltet zusätzliche Debug-Ausgaben. Das könnte als Ausgangspunkt für Ihre Aufgabe dienen.

https://github.com/hpaulj/numpy-einsum

Die neuesten einsum hat einige Optimierung, mit einiger Debugging-Hilfe. np.einsum_path bietet weitere Informationen dazu.

Understanding NumPy's einsum

https://en.wikipedia.org/wiki/Einstein_notation

0

Erstens, warum brauchen Sie B 2-dim zu sein? Warum nicht einfach np.einsum('ab , b -> a', A, B)?

Nun die eigentliche Frage: Es ist nicht genau das, was Sie wollen, aber mit intelligenten Entscheidungen für A und B können Sie dies sichtbar machen. z.B. A = [[1,10],[100,1000]] und B = [1,2], was gibt np.einsum('ab , b -> a', A, B) = [21,2100] und es ist ziemlich offensichtlich, was passiert ist.

Allgemeinere Versionen sind ein bisschen komplizierter (aber hoffentlich nicht notwendig). Die Idee ist, verschiedene Primzahlpotenzen zu verwenden (besonders nützlich sind 2 und 5, da sie sich im dezimalen System auf einfache readyable Zahl ausrichten). Falls Sie mehr als einen Wert summieren möchten, können Sie Primzahlen (2,3,5,7 usw.) verwenden und das Ergebnis in ein anderes Zahlensystem konvertieren. Für den Fall, dass Sie über zwei Dims-> 30-ary System 3 Dims (2,3,5,7) -> 210-System