2009-06-22 13 views
11

SymPy ist ein großes Werkzeug für die Einheitenumwandlungen in Python zu tun:Umwandlung Einheiten in Python

>>> from sympy.physics import units 
>>> 12. * units.inch/units.m 
0.304800000000000 

Sie können ganz einfach Ihre eigene Rolle:

>>> units.BTU = 1055.05585 * units.J 
>>> units.BTU 
1055.05585*m**2*kg/s**2 

Allerdings kann ich nicht in meine Anwendung implementieren, es sei denn Ich kann Grad C (absolut) in K in Grad F in Grad R oder in eine beliebige Kombination davon umwandeln.

Ich dachte, vielleicht so etwas wie dies funktionieren würde:

units.degC = <<somefunc of units.K>> 

Aber klar, dass ist der falsche Weg nach unten zu gehen. Irgendwelche Vorschläge für die saubere Implementierung von "Offset" -Typ-Conversions in SymPy?

Hinweis: Ich bin offen für den Versuch, andere Einheiten Umrechnungsmodule, aber kenne keine anderen neben Unum, und fand es umständlich.

Bearbeiten: OK, jetzt ist klar, dass ich zuerst feststellen möchte, ob die beiden zu vergleichenden Größen im selben Koordinatensystem liegen. (wie Zeiteinheiten Bezug auf verschiedene Epochen oder Zeitzonen oder dB zu geraden Amplitude), machen Sie die entsprechende Transformation, dann machen Sie die Umwandlung. Gibt es allgemeine Tools zur Verwaltung des Koordinatensystems? Das wäre großartig.

Ich würde die Annahme machen, dass sich ° F und ° C immer auf Δ ° F Δ ° C ​​innerhalb eines Ausdrucks beziehen, sich aber auf absolut beziehen, wenn sie alleine stehen. Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, units.degF eine Funktion zu machen und einen Dekorateur property() darauf zu schlagen, um mit diesen beiden Bedingungen umzugehen.

Aber jetzt werde ich units.C == units.K und versuchen, setzen es sehr deutlich in der Dokumentation Funktionen nutzen convertCtoK(...) und convertFtoR(...) zu machen, wenn sie mit absoluten Einheiten handelt. (Nur ein Scherz Nein, werde ich nicht..)

+2

Schade 'sympy.physics.units' hat keine Dokumentation. –

+0

GNU Units trennt sie in 'degF' und' tempF (x) ': https://www.gnu.org/software/units/manual/units.html#Temperature-Conversions – endolith

Antwort

4

Ich persönlich mag Quantities dank seiner NumPy Integration, aber es macht nur relative Temperaturen, nicht absolut.

+0

Ich denke, Sie könnten mich auf Mengen verkauft haben. Schön und leicht, numply Integration und/Unsicherheiten/zu booten. Vielen Dank. ..noch auf der Suche nach einem vernünftigen Workaround für das "Offset-Koordinatensystem-Problem". – Paul

+0

Würden Sie es über [units] (https://pypi.python.org/pypi/units/) empfehlen? – endolith

8

Die Unum Dokumentation hat eine ziemlich gute Zuschreibung auf, warum dies ist schwer:

Unum ist nicht in der Lage zuverlässig zu behandeln Konvertierungen zwischen ° Celsius und Kelvin. Das Problem wird als "falsches Ursprungsproblem" bezeichnet: die 0 ° Celsius ist als 273,15 K definiert. Dies ist wirklich ein spezieller und ärgerlicher Fall, da im Allgemeinen der Wert 0 von der Einheitenumwandlung nicht beeinflusst wird, z. 0 [m] = 0 [Meilen] = .... Hier ist die Umrechnung Kelvin/° Celsius durch einen Faktor 1 und einen Offset von 273,15 K gekennzeichnet. Der Offset ist in der aktuellen Version von Unum nicht durchführbar.

Darüber hinaus wird es vermutlich nie in eine zukünftige Version integriert werden, da es auch ein konzeptionelles Problem gibt: Der Offset sollte angewendet werden, wenn die Menge eine absolute Temperatur darstellt, aber nicht, wenn die Menge eine Temperaturdifferenz darstellt. Zum Beispiel ist eine Temperaturerhöhung von 1 ° Celsius gleichbedeutend mit einem Anstieg von 1 K. Es ist unmöglich zu erraten, was der Benutzer denkt, ob es sich um eine absolute oder eine relative Temperatur handelt. Die Frage nach absoluten und relativen Größen ist für andere Einheiten unwichtig, da sich die Antwort nicht auf die Konvertierungsregel auswirkt. Unum kann die beiden Fälle nicht unterscheiden.

Es ist ziemlich einfach, konzeptionell die Probleme mit dem Versuch zu sehen, die absolute Temperaturumwandlung symbolisch darzustellen. Mit jeder normalen relativen Einheit ist (x unit) * 2 == (x * 2) unit-Einheit Mathematik kommutativ.Bei absoluten Temperaturen bricht das zusammen - es ist schwierig, etwas Komplizierteres zu tun als eine direkte Temperaturumwandlung ohne andere Maßeinheiten. Es ist wahrscheinlich am besten, wenn Sie alle Berechnungen in Kelvin behalten und nur an den Ein- und Ausstiegspunkten Ihres Codes zu und von anderen Temperatureinheiten umrechnen.

+3

Es gibt einen Grund, dass es beide Datumsangaben gibt und Timedelta-Objekte. Was verhindert das gleiche bei der Temperatur? – jfs

+0

Sie könnten es tun, Sie können die absoluten Temperatureinheiten nicht in eine symbolische Mathematikbibliothek integrieren, in der die Einheitsmathematik kommutativ ist. – Miles

+0

Sie können es gut integrieren. Siehe meine Antwort http://stackoverflow.com/questions/1025145/units-conversion-in-python/1025258#1025258 – jfs

0

Beispiel, wie es funktionieren könnte:

>>> T(0*F) + 10*C 
T(265.37222222222221*K) # or T(47767/180*K) 
>>> T(0*F + 10*C) 
T(283.15*K) 
>>> 0*F + T(10*C) 
T(283.15*K) 
>>> 0*F + 10*C 
10*K 
>>> T(0*F) + T(10*C) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'absolute_temperature' and \ 
'absolute_temperature' 
>>> T(0*F) - T(10*C) 
T(245.37222222222223*K) # or T(44167/180*K) 
>>> 0*F - 10*C 
-10*K 
+1

>>> T (0 * F + 10 * C) #? – Miles

+0

@Miles: Vielen Dank für Ihren Kommentar so kryptisch wie die Antwort! Etwas wurde aus dem Kopieren/Einfügen weggelassen. T ist ein Tesla in Physik. Aber ich nehme an, dass ich es selbst neu definieren soll. – Paul

+0

@bpowah: 'T' ist' absolute_temperature' hier. – jfs

0

Das natu Paket behandelt Einheiten der Temperatur. Zum Beispiel können Sie dies tun:

>>> from natu.units import K, degC, degF 
>>> T = 25*degC 
>>> T/K 
298.1500 
>>> T/degF 
77.0000 
>>> 0*degC + 100*K 
100.0 degC 

Präfixe werden auch unterstützt:

>>> from natu.units import mdegC 
>>> 100*mdegC/K 
273.2500 

natu Griffe auch nicht-lineare Einheiten wie die decibel, nicht nur diejenigen mit Offsets wie degree Celsius und degree Fahrenheit.

auf das erste Beispiel bezieht ihr habt, Sie können dies tun.

>>> from natu import units 
>>> 12*units.inch/units.m 
0.3048 

BTU bereits eingebaut ist, können Sie seine Anzeigeeinheit m ändern ** 2 * kg/s ** 2, aber Standardmäßig natu vereinfacht das Gerät zu J:

>>> from natu.units import BTU 
>>> BTU.display = 'm2*kg/s2' 
>>> 1*BTU 
1055.05585262 J