2017-12-07 6 views
0

Ich konvertiere ein Matlab-Skript nach Python und erhalte verschiedene Ergebnisse in der Reihenfolge 10 ** - 4.Precision Matlab und Python (numpy)

in Matlab:

f_mean=f_mean+nanmean(f); 
f = f - nanmean(f); 

f_t = gradient(f); 
f_tt = gradient(f_t); 

if n_loop==1 
    theta = atan2(sum(f.*f_tt), sum(f.^2)); 
end 

theta = -2.2011167e+03 

In Python:

f_mean = f_mean + np.nanmean(vel) 

vel = vel - np.nanmean(vel) 

firstDerivative = np.gradient(vel) 
secondDerivative = np.gradient(firstDerivative) 


if numberLoop == 1: 
    theta = np.arctan2(np.sum(vel * secondDerivative), 
         np.sum([vel**2])) 

Obwohl erste und secondDerivative die gleichen Ergebnisse in Python und Matlab geben, f_mean ist etwas anders: -0,0066412 (Matlab) und -0,0066414 (Python); und so Theta: -0.4126186 (M) und -0.4124718 (P). Es ist ein kleiner Unterschied, führt aber am Ende zu unterschiedlichen Ergebnissen in meinen Skripten.

Ich weiß, dass einige Leute nach diesem Unterschied gefragt haben, aber immer in Bezug auf Std, die ich bekomme, aber nicht in Bezug auf Mittelwerte. Ich frage mich, warum es so ist.

+2

Es wäre hilfreich, wenn Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) bereitstellen könnten. Sie haben den Code angezeigt, der großartig ist, aber Sie haben das Eingabearray 'f_mean' nicht bereitgestellt, sodass wir den Code nicht ausführen können, um das Ergebnis zu reproduzieren. –

+0

Im Python-Code ist 'f_mean' anfangs ein numpy Array? Wenn ja, was ist 'f_mean.dtype'? –

+0

Sache ist das Array ist riesig, über eine Million Daten. aber vel würde mit [-0.042 -0.028 -0.038 -0.013 -0.026 -0.031 -0.0560 ...] beginnen. –

Antwort

1

Eine mögliche Quelle des Anfangsabstands Sie (zwischen Mittel) beschreiben könnte numpy der sein use von pairwise summation, die auf großen Arrays typischerweise wesentlich genauer als die naive Methode sein wird:

a = np.random.uniform(-1, 1, (10**6,)) 
a = np.r_[-a, a] 
# so the sum should be zero 

a.sum() 
# 7.815970093361102e-14 

# use cumsum to get naive summation: 
a.cumsum()[-1] 
# -1.3716805469243809e-11 

bearbeiten (Danke @ sascha): für das letzte Wort und als "provably exact" Referenz könnten Sie math.fsum verwenden:

import math 
math.fsum(a) 
# 0.0 

D on't Matlab, also kann nicht überprüfen, was sie tun.

+0

Und nur zum Spaß: '' 'math.fsum (a.tolist())' '' (noch genauer, aber wahrscheinlich viel langsamer). – sascha

+0

@sascha Ordentlich! Es ist eher langsam, aber komischerweise scheint es schneller als Python Summe ... –

Verwandte Themen