Python中的单位转换

Chr*_*ett 46 python units-of-measurement

我正在开发一个项目,让用户可以随时跟踪不同的数据类型.基本思想的一部分是用户应该能够使用他们需要的任何单位输入数据.我一直在看两个单位:

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

和数量:

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

但是我不确定最好的方法.据我所知,数量更复杂,但包括更好的初始单位列表.

Chr*_*uns 29

我赞赏在科学计算应用中使用显式单位.使用明确的单位类似于刷牙.它预先增加了一些乏味,但从长远来看,你获得的类型安全可以省去很多麻烦.比方说,不要将1.25亿美元的轨道飞行器撞向行星.

您还应该查看这两个其他python单元/数量包:

UNUM

Scientific.Physics.PhysicalQuantity

我曾经研究过Scientific.Physics.PhysicalQuantity.它不能满足我的需求,但可能会满足你的需求.很难说出您的简要说明中需要哪些功能.

我最终编写了自己的python包进行单位转换和维度分析,但它尚未正确打包以供发布.我们在用于GPU加速分子力学的OpenMM系统的python绑定中使用我的单元系统.您可以在以下位置浏览我的python单元代码的svn存储库:

SimTK蟒蛇单位

最终我打算打包它以便分发.如果您觉得有趣,请告诉我.这可能会激励我尽早打包它.我在设计SimTK python单元系统时所寻找的功能包括以下内容:

  1. 单位不一定在内部以SI单位存储.这对我来说非常重要,因为我们的一个重要应用领域是分子规模.内部使用SI单位会导致常用分子力计算中的指数溢出.在内部,所有单位系统在SimTK中同样重要.
  2. 我希望C++中的Boost.Units系统具有类似的功能和灵活性.两者都是因为我熟悉这个系统,并且因为它是在一大群杰出的工程师的监督下设计的.Boost.Units是一个精心设计的第二代维度分析系统.因此我可能认为SimTK单位系统是第三代系统:).请注意,虽然Boost.Units是一个没有运行时成本的"零开销"系统,但所有python数量实现(包括SimTK单元)可能都会产生运行时成本.
  3. 我想要与numpy数组兼容的尺寸数量,但不一定需要python numpy包.换句话说,数量可以基于numpy数组或内置的python类型.

哪些功能对您很重要?


Mar*_*ski 19

品脱最近来到了这个领域.有人愿意分享他们的经历吗?看起来不错.仅供参考:看起来Pint将在不久的将来与不确定性相结合.

  • 我正在评估Pint,我写这个,但是一个大的*+ 1*是它能够使用Decimal,这意味着没有任何时髦的浮动舍入错误 - 提到的所有提到的libaries似乎只能在float类型中工作 - http:// python -in-the-lab.blogspot.ca/2013/01/how-many-pints-do-you-want-units-in.html (3认同)
  • 对于Pint,我不再是+1了-在最近的两天内,我已提交了两个错误修复程序-我正在辩论是否真的需要额外的功能/复杂性,而可以直接使用诸如http://之类的东西code.activestate.com/recipes/577652-unit-conversions-using-decimal/ (2认同)

oka*_*tal 8

我很惊讶还没有人提到 SymPy。SymPy是一个成熟且维护良好的 Python 符号数学库,而且是NumFOCUS 赞助的项目。

它有一个物理模块,其中包含许多有用的类和函数,用于“解决物理问题”。我认为,与您最相关的是,它有一个Unit子模块,其中包含您需要的一切;只需阅读优秀的文档即可。


ube*_*kel 7

请注意,quantities对温度的支持非常差:

>>> (100 * pq.degC).rescale(pq.degF)
array(179.99999999999997) * degF
>>> (0 * pq.degC).rescale(pq.degF)
array(0.0) * degF
Run Code Online (Sandbox Code Playgroud)

0摄氏度不是0华氏度.他们的框架不支持任何类型的转换,而不仅仅是乘以一个因子.

  • 温度很棘手,因为有两种类型-绝对/热力学温度和相对/温度差。绝对地,每个人都知道0°F!= 0°C。当谈论温度差(ΔT)时,0°F == 0°C。 (2认同)

kda*_*es4 6

您可能想查看一个名为natu的新软件包。它解决了@ChristopherBruns 列出的三个问题。它可以在PyPI中使用。

我是该软件包的作者,非常感谢任何意见或建议。


olq*_*plo 6

yt-project中还有另一个名为unyt的软件包。unyt的作者承认Pint和astropy.units的存在。支持与其他软件包之间的转换。

Unyt的卖点是速度。它比其他两个要快。本文在几个基准测试中对单位软件包进行了比较。

对于那些痴迷于性能的人来说,基准测试令人失望。:-(使用这些单位系统中的任何一个单位的计算速度变慢很大。对于具有1000个条目的阵列,速度变慢系数是6-10(对于较小的阵列则更糟)。

免责声明:我不隶属于联合国,我只是想分享我学到的有关单元系统的知识。


Jam*_*der 5

看起来另一个包也可以做到这一点,由 web2py 的 Massimo DiPierro 编写,名为Buckingham

另外值得注意的是,布莱恩这样的事情已经有一段时间了。

  • 丹尼尔,你提到的具体错误是因为磅的内部定义是力的单位而不是质量的单位。此外,它当然没有支持单位的详尽列表。 (2认同)