2016-06-01 7 views
3

Ich muss einige Matlab-Code in Python 3 übersetzen und ich stoße oft auf Bereiche des Formulars Start: Schritt: Stopp. Wenn diese Argumente alle Ganzzahlen sind, übersetze ich diesen Befehl einfach mit np.arange(), aber wenn einige der Argumente float sind, insbesondere der step-Parameter, bekomme ich in Python nicht die gleiche Ausgabe. Zum BeispielMatlab Bereich in Python

7:8 %In Matlab 
7 8 

Wenn ich will es in Python übersetzen verwende ich einfach:

np.arange(7,8+1) 
array([7, 8]) 

Aber wenn ich, sagen wir mal:

7:0.3:8 %In Matlab 
7.0000 7.3000 7.6000 7.9000 

ich es nicht übersetzen kann unter Verwendung der gleichen Logik:

np.arange(7, 8+0.3, 0.3) 
array([ 7. , 7.3, 7.6, 7.9, 8.2]) 

In dieser Fall, ich darf den Schritt nicht zum Stop-Argument hinzufügen.

Aber dann, wenn ich:

7:0.2:8 %In Matlab 
7.0000 7.2000 7.4000 7.6000 7.8000 8.0000 

kann ich meine erste Idee verwenden:

np.arange(7,8+0.2,0.2) 
array([ 7. , 7.2, 7.4, 7.6, 7.8, 8. ]) 

Mein Problem kommt von der Tatsache, dass ich nicht fest codierte Zeilen wie diese bin zu übersetzen. Tatsächlich können sich die Parameter dieser Bereiche abhängig von den Eingaben der Funktion, an der ich arbeite, ändern. Daher kann ich manchmal 0.2 oder 0.3 als Schrittparameter haben. Also im Grunde wissen Sie, ob es eine andere numpy/scipy oder was auch immer Funktion gibt, die wirklich wie Matlab-Bereich funktioniert, oder wenn ich ein wenig Code selbst hinzufügen muss, um sicherzustellen, dass mein Python-Bereich mit derselben Nummer endet Matlab?

Danke!

+1

Wenn Sie mit 'floats' arbeiten, ist es besser,' numpy.linspace' zu ​​verwenden, an das Sie die endgültige Array-Größe mehr als einen Schritt übergeben. Es vermeidet einige Rundumbelästigungen. –

Antwort

7

Sie müssen nicht wirklich Ihre gesamte Schrittgröße an die maximale Grenze von np.arange hinzufügen, aber nur eine sehr kleine Zahl, um sicherzustellen, dass das max eingeschlossen ist. Für das Beispiel machine epsilon:

eps = np.finfo(np.float32).eps 

eps Zugabe erhalten Sie das gleiche Ergebnis wie MATLAB in allen drei Ihrer Szenarien tut:

In [13]: np.arange(7, 8+eps) 
Out[13]: array([ 7., 8.]) 

In [14]: np.arange(7, 8+eps, 0.3) 
Out[14]: array([ 7. , 7.3, 7.6, 7.9]) 

In [15]: np.arange(7, 8+eps, 0.2) 
Out[15]: array([ 7. , 7.2, 7.4, 7.6, 7.8, 8. ]) 
+0

@farenorth aber was ist mit etwas wie '6.9' bis' 8' in Schritten von '0.3. In MATLAB '6.9: 0.3: 8' gibt' [6.9, 7.2, 7.5, 7.8] 'zurück, während' np.arange (6.9, 8 + 0.3/2, 0.3) '' array zurückgibt ([6.9, 7.2, 7.5, 7.8 , 8.1]) '. Aber 'np.arange (6.9, 8 + eps, 0.3)' wird dir 'array ([6.9, 7.2, 7.5 7.8])' – Dan

1

Matlab Dokumentation für linspace sagen

linspace ist ähnlich wie der Doppelpunktoperator, ":", aber gibt direkte Kontrolle über die Anzahl der Punkte und schließt immer die Endpunkte ein. "lin" in dem Namen "linspace" bezieht sich auf das Erzeugen linear beabstandeter Werte im Gegensatz zu dem Geschwisterfunktions-Logspace, der logarithmisch beabstandete Werte erzeugt.

numpyarange hat eine ähnliche Beratung.

Bei Verwendung eines nicht ganzzahligen Schritts, z. B. 0,1, werden die Ergebnisse oft nicht konsistent sein ( ). Es ist besser, linspace für diese Fälle zu verwenden.

Ende des Intervalls.Das Intervall enthält diesen Wert nicht, mit Ausnahme von in einigen Fällen, in denen step keine Ganzzahl ist und Gleitkomma Abrundung die Länge von out betrifft.

So Unterschiede in wie Schrittgröße in Anzahl der Schritte übersetzt wird, können Unterschiede in der Anzahl der Schritte ergeben. Wenn Sie Konsistenz zwischen den beiden Codes benötigen, ist linspace die bessere Wahl (in beiden).

+0

geben, dem stimme ich vollkommen zu. Eine solche Fließkomma-Schritt-für-Spezifikation mit der Anzahl von Schritten, die durch Abschneiden betroffen sind, ist grundlegend gebrochen. Dies hilft dem OP nicht, aber die Matlab-Quelle wenn möglich zu fixieren wird absolut bevorzugt - es kann sogar einen latenten Fehler in der Matlab-Quelle aufdecken. – welch