web-dev-qa-db-fra.com

Conversion d'unité en Python

Je travaille sur un projet qui permet aux utilisateurs de suivre différents types de données au fil du temps. Une partie de l'idée de base est qu'un utilisateur devrait pouvoir saisir des données en utilisant toutes les unités dont il a besoin. J'ai regardé les deux unités:

http://pypi.python.org/pypi/units/

et quantités:

http://pypi.python.org/pypi/quantities/

Cependant, je ne suis pas sûr de la meilleure façon de procéder. D'après ce que je peux dire, les quantités sont plus complexes, mais comprennent une meilleure liste initiale d'unités.

46
Chris Drackett

J'applaudis l'utilisation d'unités explicites dans les applications de calcul scientifique. L'utilisation d'unités explicites équivaut à se brosser les dents. Il ajoute un peu d'ennui à l'avant, mais la sécurité de type que vous obtenez peut économiser beaucoup d'ennuis à long terme. Comme, disons, sans écraser 125 millions de dollars sur des planètes .

Vous devriez aussi probablement vérifier ces deux autres packages python unités/quantités:

num

Scientific.Physics.PhysicalQuantity

J'ai une fois enquêté sur Scientific.Physics.PhysicalQuantity. Il ne répondait pas tout à fait à mes besoins, mais pourrait satisfaire les vôtres. Il est difficile de dire de quelles fonctionnalités vous avez besoin dans votre brève description.

J'ai fini par écrire mon propre package python pour la conversion d'unités et l'analyse dimensionnelle, mais il n'est pas encore correctement conditionné pour la sortie. Nous utilisons mon système d'unité dans les liaisons python pour notre système OpenMM pour la mécanique moléculaire accélérée par GPU. Vous pouvez parcourir le référentiel svn de mon code python unités sur:

SimTK python unités

Finalement, j'ai l'intention de l'empaqueter pour la distribution. Si vous le trouvez intéressant, faites-le moi savoir. Cela pourrait me motiver à l’emballer plus tôt. Les fonctionnalités que je recherchais lors de la conception du système d'unités SimTK python étaient les suivantes:

  1. Les unités ne sont PAS nécessairement stockées en termes d'unités SI en interne. C'est très important pour moi, car un domaine d'application important pour nous est à l'échelle moléculaire. L'utilisation interne des unités SI peut entraîner un débordement d'exposant dans les calculs de force moléculaire couramment utilisés. En interne, tous les systèmes d'unités sont également fondamentaux dans SimTK.
  2. Je voulais une puissance et une flexibilité similaires au système Boost.Units en C++. À la fois parce que je connais ce système et parce qu'il a été conçu sous le contrôle d'un grand groupe d'ingénieurs brillants. Boost.Units est un système d'analyse dimensionnelle de deuxième génération bien conçu. Ainsi, je pourrais faire valoir que le système d'unités SimTK est un système de troisième génération :). Sachez que même si Boost.Units est un système "sans frais généraux" sans coût d'exécution, toutes les implémentations de quantité python, y compris les unités SimTK, exigent probablement un coût d'exécution.
  3. Je veux des Quantités dimensionnées qui sont compatibles avec les tableaux numpy, mais ne nécessitent pas nécessairement le package python numpy. En d'autres termes, les quantités peuvent être basées sur des tableaux numpy ou sur des types python intégrés.

Quelles fonctionnalités sont importantes pour vous?

29
Christopher Bruns

Pint est récemment venu sur le terrain. Quelqu'un veut-il partager ses expériences? Cela semble bon. FYI: Il ressemble à Pint sera intégré avec Incertitudes dans un proche avenir.

19
Mark Mikofski

Notez que quantities a un très mauvais support pour la température:

>>> (100 * pq.degC).rescale(pq.degF)
array(179.99999999999997) * degF
>>> (0 * pq.degC).rescale(pq.degF)
array(0.0) * degF

0 degré Celsius n'est pas 0 degré Fahrenheit. Leur cadre ne prend en charge aucun type de conversion qui ne se contente pas de multiplier par un facteur.

7
ubershmekel

Il existe un autre package appelé nyt du projet yt. Les auteurs de unyt reconnaissent l'existence de Pint et d'astropy.units. Les conversions de et vers ces autres packages sont prises en charge.

Le point de vente de unyt est vitesse. C'est plus rapide que les deux autres. Les packages d'unités sont comparés dans plusieurs références dans ce papier .

Les repères sont décevants pour tous ceux qui sont obsédés par la performance. :-( Le ralentissement des calculs avec l'un de ces systèmes d'unités est important. Le facteur de ralentissement est 6-10 pour les tableaux à 1000 entrées (pire pour les plus petits tableaux).

Avertissement: je ne suis pas affilié à unyt, je veux juste partager ce que j'ai appris sur les systèmes d'unités.

5
olq_plo

Il semble qu'un autre package soit également sorti pour cela, écrit par Massimo DiPierro de la renommée web2py, appelé Buckingham .

A noter également, Brian a quelque chose comme ça depuis un certain temps.

4
James Snyder

Vous voudrez peut-être regarder un nouveau paquet appelé nat . Il aborde les trois problèmes répertoriés par @ChristopherBruns. Il est disponible en PyPI .

Je suis l'auteur de ce dossier et j'apprécierais tout commentaire ou suggestion.

3
kdavies4

Je suis surpris que personne n'ait encore mentionné SymPy. SymPy est une bibliothèque de mathématiques symboliques mature et bien entretenue pour Python qui est en outre un projet parrainé par NumFOCUS ).

Il a un module Physique avec de nombreuses classes et fonctions utiles pour "résoudre des problèmes en physique". Le plus pertinent pour vous, il a un sous-module nit qui contient tout ce dont vous avez besoin, je pense; il suffit de lire l'excellente documentation.

2
buenaonda

Je pense que vous devriez utiliser des quantités, car une quantité a des unités qui lui sont associées.

La pression, par exemple, sera une quantité qui pourrait être entrée et convertie dans et en différentes unités (Pa, psi, atm, etc.). Vous pourriez probablement créer de nouvelles quantités spécifiques à votre application.

1
Pedro Ghilardi