2010-01-23 61 views
37

我正在開發一個項目,讓用戶隨着時間的推移跟蹤不同的數據類型。部分基本思想是用戶應該能夠使用他們需要的任何單位輸入數據。我一直在看兩個單元Python中的單位換​​算

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

和數量:

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

但是我不知道去的最佳途徑。從我所知道的情況來看,數量更爲複雜,但包含更好的初始單位列表。

+3

我認爲你需要更具體地瞭解你的問題是什麼,才能得到有效的答案。 – 2010-01-23 23:38:54

+0

我假設你將存儲標準化爲SI單位的數據,所以實際上這是輸入時的解析問題,可能是輸出中的轉換問題。 使用哪個庫具有最佳的解析/轉換 - 您可以在進出的方式上使用不同的庫。 – 2010-01-28 22:08:55

+0

不幸的是,python中有很多解決方案。 http://pint.readthedocs.org/en/latest/faq.html#you-mention-other-similar-python-libraries-can-you-point-me-to-those – endolith 2014-05-22 15:11:11

回答

1

我認爲你應該使用數量,因爲數量有一些與它相關的單位。例如,壓力將是可以輸入並轉換成不同單位(Pa,psi,atm等)的數量。可能您可以爲您的應用程序創建新的數量細節。

24

我贊成在科學計算應用中使用顯式單位。使用明確的單位類似刷牙。它在前面增加了一些乏味,但從長遠來看,您獲得的類型安全可以節省很多麻煩。就像說,not crashing $125 million orbiters into planets

你也應該大概檢查了這兩個其他的Python單元/包數量:

Unum

Scientific.Physics.PhysicalQuantity

我曾經調查Scientific.Physics.PhysicalQuantity。它不完全符合我的需求,但可能會滿足您的需求。從簡要說明中很難說出您需要哪些功能。

我最終編寫了我自己的python包進行單位轉換和三維分析,但它沒有正確打包發佈。我們在GPU加速分子力學的OpenMM系統中使用我的單元系統進行python綁定。你可以在瀏覽我的蟒蛇單位代碼SVN倉庫:

SimTK python units

最後,我打算將它打包進行分發。如果您覺得有趣,請告訴我。這可能會激勵我儘快將其打包。我在設計SimTK python單元系統時尋找的功能包括:

  1. 單位不一定以國際單位制單位內部存儲。這對我來說非常重要,因爲我們的一個重要應用領域是分子尺度。內部使用SI單位會導致常用分子力計算中的指數溢出。在內部,所有的單元系統在SimTK中同樣重要。
  2. 我希望C++中的Boost.Units系統具有類似的功能和靈活性。這是因爲我熟悉這個系統,也是因爲它是在一大羣優秀的工程師的審查下設計的。 Boost.Units是一個製作精良的第二代維度分析系統。因此我可能會爭辯說SimTK單位系統是第三代系統:)。請注意,儘管Boost.Units是一個沒有運行時成本的「零開銷」系統,但所有的python數量實現(包括SimTK單元)都可能會確保運行時成本。
  3. 我想要尺寸的數量與numpy數組兼容,但不一定需要python numpy包。換句話說,數量可以基於numpy數組或基於python類型構建。

什麼特徵對您很重要?

4

它看起來像另一個軟件包也出現了這樣做,由web2py名譽,稱爲Buckingham Massimo DiPierro。

同樣值得注意的是,Brian已經有一段時間了。

+0

白金漢似乎不完整,無法轉換例如:>>>(Number(100,dims ='gram'))。convert('pound')。值 'RuntimeError:Incompatible Dimensions'' – 2013-08-19 19:57:35

+1

Daniel,您提到的特定錯誤這是因爲英鎊的內部定義是作爲一個力量單位而不是質量單位。另外,它當然沒有支持單元的詳盡列表。 – 2013-08-19 22:16:05

+0

啊,這是有道理的,添加磅質量支持添加''lb':(453.592,0,0,1,0,0,0),#lb'到'UNITS'列表。 – 2013-08-20 13:53:41

6

注意quantities對溫度非常糟糕的支持:

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

0攝氏度不爲0華氏度。他們的框架不支持任何不僅僅乘以一個因素的轉換。

+0

溫度是棘手的,因爲有兩種類型 - 絕對/熱力學溫度和相對溫度差異。絕對的,每個人都知道0°F!= 0°C。談論溫差(ΔT)時,0°F == 0°C。 – 2017-08-29 15:15:26

15

Pint最近進入該領域。任何人都在意分享他們的經驗?看起來不錯。僅供參考:在不久的將來,它看起來像Pint will be integrated with Uncertainties

+3

品脫是真棒! – canesin 2013-07-24 11:23:26

+2

我正在評價品脫我寫這個,但一個大* + 1 *是它可以使用十進制,這意味着沒有時髦的浮動四捨五入錯誤 - 提到的所有提到的庫似乎只能用浮動類型 - http://蟒蛇,在最lab.blogspot。ca/2013/01/how-many-pints-do-you-want-units-in.html – 2013-08-13 16:37:50

+0

我不再是Pint的+1了 - 在過去的兩天裏我已經提交了兩個bug修復 - 我我在辯論,如果我真的需要額外的功能/複雜性,而是可以直接使用像http://code.activestate.com/recipes/577652-unit-conversions-using-decimal/ – 2013-08-16 20:03:06

3

您可能需要查看名爲natu的新套件。它解決了@ChristopherBruns列出的三個問題。它在PyPI中可用。

我是該軟件包的作者,我很感激任何意見或建議。

2

我很驚訝沒有人提到SymPy。 SymPy是一個成熟且維護良好的Python的符號數學庫,而且是一個NumFOCUS-sponsored項目。

它有一個Physics模塊具有許多有用的類和功能「解決物理問題」。與你最相關的是,它有一個Unit子模塊,其中包含你需要的一切,我想;只要閱讀優秀的文檔。