Преобразование единиц в Python - PullRequest
46 голосов
/ 24 января 2010

Я работаю над проектом, который позволяет пользователям отслеживать разные типы данных с течением времени. Частью базовой идеи является то, что пользователь должен иметь возможность вводить данные, используя любые необходимые им единицы. Я смотрел на оба блока:

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

и количество:

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

Однако я не уверен, что лучший путь. Из того, что я могу сказать, количества являются более сложными, но включают лучший начальный список единиц.

Ответы [ 8 ]

29 голосов
/ 05 февраля 2010

Я приветствую использование явных единиц в научных вычислительных приложениях. Использование явных единиц аналогично чистке зубов. Это добавляет немного усталости, но безопасность типов, которую вы получаете, может сэкономить много проблем в долгосрочной перспективе. Как, скажем, не врезать орбитальные спутники в 125 миллионов долларов в планеты .

Вы также, вероятно, должны проверить эти два других пакета единиц / количества Python:

Unum

Scientific.Physics.PhysicalQuantity

Однажды я исследовал Scientific.Physics.PhysicalQuantity. Это не совсем соответствовало моим потребностям, но могло бы удовлетворить ваши. Трудно сказать, какие функции вам нужны из вашего краткого описания.

В итоге я написал свой собственный пакет Python для преобразования единиц измерения и анализа размеров, но он еще не упакован должным образом для выпуска. Мы используем мою систему единиц в привязках python для нашей системы OpenMM для ускоренной молекулярной механики на GPU. Вы можете просмотреть svn-репозиторий моего кода модулей Python по адресу:

Единицы SimTK Python

В конце концов я собираюсь упаковать его для распространения. Если вам интересно, пожалуйста, дайте мне знать. Это может побудить меня собрать вещи раньше. Функции, которые я искал при разработке системы модулей Python SimTK, включали следующее:

  1. Единицы НЕ обязательно хранятся в единицах СИ внутри. Это очень важно для меня, потому что одна важная область применения для нас находится на молекулярном уровне. Внутреннее использование единиц СИ может привести к переполнению показателя в обычно используемых расчетах молекулярной силы. Внутри все системы единиц одинаково фундаментальны в SimTK.
  2. Мне хотелось, чтобы мощность и гибкость были такими же, как у Boost.Units в C ++. И потому, что я знаком с этой системой, и потому, что она была разработана под пристальным вниманием большой группы блестящих инженеров. Boost.Units - это хорошо продуманная система анализа измерений второго поколения. Таким образом, я могу утверждать, что система единиц SimTK - это система третьего поколения :). Имейте в виду, что, хотя Boost.Units является системой с «нулевыми накладными расходами» и не требует затрат времени выполнения, все реализации количества питонов, включая модули SimTK, вероятно, требуют затрат времени выполнения.
  3. Мне нужны размерные количества, которые совместимы с массивами numpy, но не обязательно требуют пакет с питоном python. Другими словами, количества могут быть основаны либо на массивах numpy, либо на встроенных типах python.

Какие функции важны для вас?

19 голосов
/ 11 июня 2013

Пинта недавно вышла на поле. Кто-нибудь хочет поделиться своим опытом? Выглядит хорошо. К вашему сведению: похоже, что Пинта будет интегрирована с неопределенностями в ближайшем будущем.

7 голосов
/ 14 февраля 2012

Обратите внимание, что quantities имеет очень плохую поддержку температуры:

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

0 градусов по Цельсию не 0 градусов по Фаренгейту. Их структура не поддерживает какие-либо преобразования, которые не просто умножают на коэффициент.

5 голосов
/ 12 июня 2018

Существует еще один пакет с именем unyt из проекта yt. Авторы Unyt признают существование Pint и astropy.units. Поддерживаются преобразования из и в эти другие пакеты.

Точка продажи Unyt скорость . Это быстрее, чем два других. Единичные пакеты сравниваются в нескольких тестах в этой бумаге .

Тесты разочаровывают всех, кто помешан на производительности. :-( Замедление вычислений с любой из этих систем единиц велико. Коэффициент замедления составляет 6-10 для массивов с 1000 записей (хуже для меньших массивов).

Отказ от ответственности: я не связан с Unyt, я просто хочу поделиться тем, что я узнал о системах юнитов.

4 голосов
/ 21 октября 2010

Похоже, что для этого также вышел еще один пакет, написанный Массимо ДиПьерро (Massimo DiPierro) с известностью web2py, который называется Buckingham .

Также отметим, что Брайан какое-то время имел что-то подобное.

3 голосов
/ 08 августа 2014

Возможно, вы захотите взглянуть на новый пакет под названием natu . В нем рассматриваются три проблемы, перечисленные в @ChristopherBruns. Он доступен в PyPI .

Я являюсь автором этого пакета, и я буду благодарен за любые комментарии или предложения.

2 голосов
/ 30 мая 2017

Я удивлен, что никто еще не упомянул SymPy. SymPy - это зрелая и ухоженная символическая математическая библиотека для Python, которая, кроме того, является спонсируемым NumFOCUS * проектом .

Имеет модуль Physics со множеством полезных классов и функций для "решения задач по физике". Наиболее актуальным для вас является субмодуль Unit , который содержит все, что вам нужно, я думаю; просто прочитайте отличную документацию.

1 голос
/ 24 января 2010

Я думаю, что вы должны использовать количества, потому что с количеством связаны некоторые единицы.

Например, давление будет величиной, которую можно вводить и преобразовывать в различные единицы (Па, фунт / кв.и т. д.)Возможно, вы могли бы создать новую спецификацию количеств для своего приложения.

...