web-dev-qa-db-ja.com

Pythonの単位変換

私は、ユーザーが時間の経過とともにさまざまなデータタイプを追跡できるプロジェクトに取り組んでいます。基本的な考え方の一部は、ユーザーが必要なユニットを使用してデータを入力できるようにすることです。私は両方のユニットを見てきました:

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

および数量:

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

しかし、最善の方法はわかりません。私が知ることができることから、量はより複雑ですが、単位のより良い初期リストが含まれています。

46
Chris Drackett

科学計算アプリケーションでの明示的なユニットの使用を称賛します。明示的な単位の使用は、歯を磨くのに似ています。前もって面倒な作業を追加しますが、タイプセーフティを取得することで、長い目で見れば多くの手間を省くことができます。たとえば、 1億2500万ドルのオービターを惑星に衝突させない

また、これらの2つのpython unit/quantityパッケージをチェックアウトする必要があります。

num

Scientific.Physics.PhysicalQuantity

私はかつてScientific.Physics.PhysicalQuantityを調査しました。それは私のニーズを完全には満たしていませんでしたが、あなたを満足させるかもしれません。必要な機能を簡単な説明から伝えるのは難しいです。

最終的に、ユニット変換と次元分析用に独自のpythonパッケージを作成しましたが、まだリリース用に適切にパッケージ化されていません。 GPU加速分子力学用のOpenMMシステムのpythonバインディングでユニットシステムを使用しています。私のpythonユニットコードのsvnリポジトリを参照できます:

SimTK python units

最終的には、配布用にパッケージ化する予定です。あなたがそれを面白いと思うならば、私に知らせてください。それは私がもっと早くそれをパッケージ化する動機になるかもしれません。 SimTK pythonユニットシステムを設計していたときに探していた機能には、次のものがありました。

  1. ユニットは、必ずしもSIユニットの観点から内部的に保存されるわけではありません。これは私にとって非常に重要です。なぜなら、私たちにとって重要な応用分野の1つは分子スケールであるからです。 SIユニットを内部で使用すると、一般的に使用される分子力計算で指数オーバーフローが発生する可能性があります。内部的には、SimTKではすべてのユニットシステムが等しく基本的です。
  2. C++の Boost.Units システムと同様のパワーと柔軟性が必要でした。どちらも私がそのシステムに精通しているため、そしてそれが優秀なエンジニアの大規模なグループの精査の下で設計されたためです。 Boost.Unitsは、巧妙に作成された第2世代の次元分析システムです。したがって、SimTKユニットシステムは第三世代のシステムであると私は主張するかもしれません:)。 Boost.Unitsはランタイムコストのない「ゼロオーバーヘッド」システムですが、SimTKユニットを含むすべてのpython量の実装は、おそらくランタイムコストになります。
  3. Numpy配列と互換性のあるディメンション化された数量が必要ですが、必ずしもpython numpyパッケージを必要としません。言い換えれば、Quantityはnumpy配列または組み込みのpythonタイプのいずれかに基づくことができます。

あなたにとって重要な機能は何ですか?

29

Pint が最近フィールドに登場しました。誰もが自分の経験を共有したいですか?いいね。参考までに: ピントは不確実性と統合されます 近い将来に見えます。

19
Mark Mikofski

quantitiesは温度のサポートが非常に悪いことに注意してください。

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

摂氏0度は華氏0度ではありません。それらのフレームワークは、係数を掛けるだけではない、いかなる種類の変換もサポートしていません。

7
ubershmekel

Yt-projectには nyt という別のパッケージがあります。 unytの著者は、Pintおよびastropy.unitsの存在を認めています。これらの他のパッケージとの間の変換がサポートされています。

Unytのセールスポイントはspeedです。他の2つよりも高速です。ユニットパッケージは、この paper のいくつかのベンチマークで比較されます。

ベンチマークは、パフォーマンスに夢中な人にとっては残念です。 :-(これらの単位システムのいずれかを使用した計算のスローダウンは大きい。スローダウン係数は、1000エントリの配列の場合は6-10(より小さい場合は悪い)配列)。

免責事項:私はunytと提携していません。ユニットシステムについて学んだことを共有したいだけです。

5
olq_plo

Buckingham と呼ばれるweb2py名声のMassimo DiPierroによって書かれた、これを行うための別のパッケージも出てきたようです。

また、注目すべきは、 Brian がしばらくの間このようなものを持っていたことです。

4
James Snyder

nat と呼ばれる新しいパッケージをご覧ください。 @ChristopherBrunsがリストした3つの問題に対処します。 PyPI で利用可能です。

私はそのパッケージの作成者であり、コメントや提案を歓迎します。

3
kdavies4

誰もまだSymPyに言及していないことに驚いています。 SymPy は、Pythonそれはさらに NumFOCUS-sponsored プロジェクトであるための、十分に管理された成熟した記号数学ライブラリです。

「物理学の問題を解決する」ための多くの便利なクラスと機能を備えた Physics モジュールがあります。最も関連性の高いもので、必要なものがすべて含まれる nit サブモジュールがあります。優れたドキュメントを読んでください。

2
buenaonda

数量にはいくつかの単位が関連付けられているため、数量を使用する必要があると思います。

たとえば、圧力は、さまざまな単位(Pa、psi、atmなど)で入力および変換できる数量です。おそらく、アプリケーションの新しい数量仕様を作成できます。

1
Pedro Ghilardi