Effizienter Algorithmus zur Auswertung eines 1-d-Arrays von Funktionen auf einem 1d-Numpy-Array gleicher Länge

Ich habe ein (großes) Array der Länge N mit k verschiedenen Funktionen und ein Array der Länge N mit einer Abzisse. Ich möchte die Funktionen auf der Abzisse auswerten, um ein Array mit einer Länge von N Ordinaten zurückzugeben, und ich muss dies kritisch sehr schnell tun.

Ich habe die folgende Schleife über einen Aufruf von np.where versucht, der zu langsam ist:

Erstellen Sie einige falsche Daten, um das Problem zu veranschaulichen:

def trivial_functional(i): return lambda x : i*x
k = 250
func_table = [trivial_functional(j) for j in range(k)]
func_table = np.array(func_table) # possibly unnecessary

Wir haben eine Tabelle mit 250 verschiedenen Funktionen. Jetzt erstelle ich ein großes Array mit vielen wiederholten Einträgen dieser Funktionen und einer Reihe von Punkten gleicher Länge, an denen diese Funktionen ausgewertet werden sollen.

Npts = 1e6
abcissa_array = np.random.random(Npts)
function_indices = np.random.random_integers(0,len(func_table)-1,Npts)
func_array = func_table[function_indices]

Zum Schluss durchlaufen Sie jede von den Daten verwendete Funktion und werten Sie sie an der Menge der relevanten Punkte aus:

desired_output = np.zeros(Npts)
for func_index in set(function_indices):
    idx = np.where(function_indices==func_index)[0]
    desired_output[idx] = func_table[func_index](abcissa_array[idx])

Diese Schleife dauert auf meinem Laptop ~ 0,35 Sekunden, der größte Engpass in meinem Code, um eine Größenordnung.

Weiß jemand, wie man den blinden Lookup-Aufruf von np.where vermeidet? Gibt es eine clevere Verwendung von Numba, die diese Schleife beschleunigen kann?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage