我試圖使用花式索引而不是循環來加速Numpy中的函數。據我所知,我已經正確實施了花哨的索引版本。問題是兩個函數(循環和花式索引)不會返回相同的結果。我不知道爲什麼。值得指出的是,如果使用較小的數組(如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)
兩者之間有什麼不同?這不是典型的浮點精度問題,它吸引了很多人? – spender 2009-11-23 09:50:32
20x20x20和600x20x100之間的值是否會出現問題?事情是否逐步出現錯誤,越來越多,或一次全部出錯? – AakashM 2009-11-23 10:00:20
差異的程度相當大,只是浮點錯誤。 – pealco 2009-11-23 16:08:32