Warum nicht diese beiden mathematischen Funktionen das gleiche Ergebnis zurückgeben?

StackOverflow https://stackoverflow.com/questions/1782114

  •  21-09-2019
  •  | 
  •  

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)
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top