Numpy で関数を高速化するために、ループの代わりにファンシー インデックスを使用しようとしています。私の知る限りでは、派手なインデックス作成バージョンを正しく実装しました。問題は、2 つの関数 (ループとファンシー インデックス) が同じ結果を返さないことです。理由はわかりません。より小さな配列 (たとえば、20 x 20 x 20) を使用した場合でも、関数は同じ結果を返すことに注意してください。
以下に、エラーを再現するために必要なすべてを含めました。関数が同じ結果を返す場合、行find_maxdiff(data) - find_maxdiff_fancy(data)
はゼロでいっぱいの配列を返す必要があります。
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)