Warum nicht diese beiden mathematischen Funktionen das gleiche Ergebnis zurückgeben?
Frage
Ich versuche, Phantasie Indizierung zu verwenden, anstatt von looping eine Funktion in Numpy zu beschleunigen. Um das Beste aus meinem Wissen habe ich die Phantasie Indizierung Version korrekt umgesetzt. Das Problem ist, dass die beiden Funktionen (Schleife und fancy-indiziert) nicht das gleiche Ergebnis zurück. Ich bin mir nicht sicher warum. Es ist erwähnenswert, dass die Funktionen das gleiche Ergebnis zu tun zurück, wenn eine kleinere Array verwendet wird (zum Beispiel 20 x 20 x 20).
Im Folgenden werde ich alles aufgenommen haben notwendig, den Fehler zu reproduzieren. Wenn die Funktionen das gleiche Ergebnis zu tun zurück, dann sollte die Linie find_maxdiff(data) - find_maxdiff_fancy(data)
ein Array voller Nullen zurück.
from numpy import *
def rms(data, axis=0):
return sqrt(mean(data ** 2, axis))
def find_maxdiff(data):
samples, channels, epochs = shape(data)
window_size = 50
maxdiff = zeros(epochs)
for epoch in xrange(epochs):
signal = rms(data[:, :, epoch], axis=1)
for t in xrange(window_size, alen(signal) - window_size):
amp_a = mean(signal[t-window_size:t], axis=0)
amp_b = mean(signal[t:t+window_size], axis=0)
the_diff = abs(amp_b - amp_a)
if the_diff > maxdiff[epoch]:
maxdiff[epoch] = the_diff
return maxdiff
def find_maxdiff_fancy(data):
samples, channels, epochs = shape(data)
window_size = 50
maxdiff = zeros(epochs)
signal = rms(data, axis=1)
for t in xrange(window_size, alen(signal) - window_size):
amp_a = mean(signal[t-window_size:t], axis=0)
amp_b = mean(signal[t:t+window_size], axis=0)
the_diff = abs(amp_b - amp_a)
maxdiff[the_diff > maxdiff] = the_diff
return maxdiff
data = random.random((600, 20, 100))
find_maxdiff(data) - find_maxdiff_fancy(data)
data = random.random((20, 20, 20))
find_maxdiff(data) - find_maxdiff_fancy(data)
Lösung
Das Problem ist, diese Zeile:
maxdiff[the_diff > maxdiff] = the_diff
Die linke Seite wählt nur einige Elemente der MaxDiff, aber die rechte Seite enthält alle Elemente von the_diff. Dies sollte funktionieren statt:
replaceElements = the_diff > maxdiff
maxdiff[replaceElements] = the_diff[replaceElements]
oder einfach:
maxdiff = maximum(maxdiff, the_diff)
Was, warum 20x20x20 Größe scheint zu funktionieren. Dies liegt daran, Ihre Fenstergröße zu groß ist, so dass nichts ausgeführt wird
Andere Tipps
Zuerst in fancy Ihr Signal ist jetzt 2D, wenn ich das richtig verstehen - so denke ich, es klarer zu indizieren wäre es explizit (zB amp_a = Mittelwert (Signal [t-WINDOW_SIZE: t ,:] Achse = 0). ähnlich ist es mit alen (Signal) -. dies sollte nur sein, Proben in beiden Fällen, so denke ich, es wäre klarer, dass die Verwendung
Es ist falsch, wenn Sie tatsächlich etwas in der t
Schleife zu tun - wenn samples < window_lenght
wie im 20x20x20 Beispiel, dass Schleife nie ausgeführt wird. Sobald die Schleife mehr ausgeführt als einmal (dh samples > 2 *window_length+1
), dann kommen die Fehler. Nicht sicher, warum aber -. Sie sehen gleich mir