I haben die folgende Gleichung:numpy Vektorisierung anstelle von loop
wobei v, mu sind | R^3 ist, wobei Sigma ist | R^(3x3) und wo das Ergebnis ist ein Skalarwert . Die Umsetzung dieser in numpy ist kein Problem:
result = np.transpose(v - mu) @ Sigma_inv @ (v - mu)
Jetzt habe ich eine Reihe von V-Vektoren (nennen wir sie V \ in | R^3XN) und ich würde wie die obige Gleichung in einer vektorisierten Weise auszuführen so dass, wie ein Ergebnis ich einen neuen Vektor Ergebnis \ in | R^1xn erhalten.
# pseudocode
Result = np.zeros((n, 1))
for i,v in V:
Result[i,:] = np.transpose(v - mu) @ Sigma_inv @ (v - mu)
Ich sah np.vectorize aber die Dokumentation schlägt vor, dass seine genauso wie alle Einträge Schleifen über die ich lieber tun würde, nicht zu tun. Was wäre eine elegante vektorisierte Lösung?
Als ein Seitenknoten: n könnte ziemlich groß sein und eine | R^nxn Matrix wird sicherlich nicht in meinen Speicher passen!
edit: Arbeitscodebeispiel
import numpy as np
S = np.array([[1, 2], [3,4]])
V = np.array([[10, 11, 12, 13, 14, 15],[20, 21, 22, 23, 24, 25]])
Res = np.zeros((V.shape[1], 1))
for i in range(V.shape[1]):
v = np.transpose(np.atleast_2d(V[:,i]))
Res[i,:] = (np.transpose(v) @ S @ v)[0][0]
print(Res)
Es wäre einfacher, wenn Sie ein minimales Arbeits Beispiel dafür, was bieten möchten Sie erreichen möchten, auch wenn Schleifen (zB einschließlich 'import' Aussagen und Definitionen aller verwendeten Symbole). – norok2
True: Ich habe ein minimales Beispiel hinzugefügt – juqa
Ich würde in 'np.einsum' suchen, obwohl ich glaube, dass es eine der kryptischsten Funktion in' numpy' ist, kann es genau das sein, was Sie wollen. – norok2