2010-01-23 42 views
37

Tôi đang làm việc trên một dự án cho phép người dùng theo dõi các loại dữ liệu khác nhau theo thời gian. Một phần của ý tưởng cơ bản là người dùng có thể nhập dữ liệu bằng bất kỳ đơn vị nào họ cần. Tôi đã nhìn vào cả hai đơn vị:Chuyển đổi đơn vị bằng Python

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

và số lượng:

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

Tuy nhiên tôi không chắc chắn cách tốt nhất để đi. Từ những gì tôi có thể nói, số lượng phức tạp hơn, nhưng bao gồm một danh sách đơn vị ban đầu tốt hơn.

+3

Tôi nghĩ bạn cần cụ thể hơn về câu hỏi của bạn là gì, để nhận câu trả lời hợp lệ. –

+0

Tôi cho rằng bạn sẽ lưu trữ dữ liệu được chuẩn hóa cho các đơn vị SI, vì vậy đây thực sự là vấn đề phân tích cú pháp trên đầu vào và có thể là sự cố chuyển đổi trên đầu ra. Sử dụng thư viện nào có phân tích/chuyển đổi tốt nhất - bạn có thể sử dụng các thư viện khác nhau trên đường vào và ra. –

+0

Có rất nhiều giải pháp cho điều này trong python, thật không may. http://pint.readthedocs.org/en/latest/faq.html#you-mention-other-similar-python-libraries-can-you-point-me-to-those – endolith

Trả lời

1

Tôi nghĩ bạn nên sử dụng số lượng, vì số lượng có một số đơn vị liên kết với nó.

Áp lực, ví dụ, sẽ là số lượng có thể được nhập và chuyển đổi trong và sang các đơn vị khác nhau (Pa, psi, atm, v.v ...). Có lẽ bạn có thể tạo ra các số lượng mới cụ thể cho ứng dụng của bạn.

24

Tôi hoan nghênh việc sử dụng đơn vị rõ ràng trong các ứng dụng máy tính khoa học. Sử dụng đơn vị rõ ràng là tương tự đánh răng của bạn. Nó cho biết thêm một số tedium lên phía trước, nhưng loại an toàn bạn nhận được có thể tiết kiệm rất nhiều rắc rối trong thời gian dài. Ví dụ: not crashing $125 million orbiters into planets.

Bạn cũng nên có lẽ hãy kiểm tra các đơn vị hai gói/lượng python khác:

Unum

Scientific.Physics.PhysicalQuantity

Tôi đã từng điều tra Scientific.Physics.PhysicalQuantity. Nó đã không hoàn toàn đáp ứng nhu cầu của tôi, nhưng có thể đáp ứng của bạn. Thật khó để nói những tính năng bạn cần từ mô tả ngắn gọn của bạn.

Tôi đã kết thúc viết gói python của riêng mình để chuyển đổi đơn vị và phân tích chiều, nhưng nó chưa được đóng gói đúng cách để phát hành. Chúng tôi đang sử dụng hệ thống đơn vị của tôi trong các ràng buộc python cho hệ thống OpenMM của chúng tôi cho GPU tăng tốc cơ học phân tử. Bạn có thể duyệt kho svn mã đơn vị python của tôi tại địa chỉ:

SimTK python units

Cuối cùng tôi dự định sẽ gói nó để phân phối. Nếu bạn thấy nó thú vị, xin vui lòng cho tôi biết. Điều đó có thể thúc đẩy tôi đóng gói nó sớm hơn. Các tính năng tôi đang tìm kiếm khi tôi thiết kế hệ thống đơn vị python của SimTK bao gồm:

  1. Đơn vị không nhất thiết phải được lưu trữ theo đơn vị SI trong nội bộ. Điều này rất quan trọng đối với tôi, bởi vì một lĩnh vực ứng dụng quan trọng đối với chúng tôi là ở quy mô phân tử. Sử dụng đơn vị SI trong nội bộ có thể dẫn đến tràn số mũ trong các phép tính lực phân tử thường được sử dụng. Bên trong, tất cả các hệ thống đơn vị đều có cơ sở như nhau trong SimTK.
  2. Tôi muốn có quyền lực và tính linh hoạt tương tự với hệ thống Boost.Units trong C++. Cả hai vì tôi quen thuộc với hệ thống đó, và bởi vì nó được thiết kế dưới sự giám sát của một nhóm lớn các kỹ sư xuất sắc. Boost.Units là hệ thống phân tích chiều thế hệ thứ hai được chế tạo tốt. Vì vậy, tôi có thể lập luận rằng hệ thống đơn vị SimTK là một hệ thống thế hệ thứ ba :). Hãy nhận biết rằng trong khi Boost.Units là một hệ thống "zero overhead" không có chi phí thời gian chạy, tất cả các triển khai số lượng python, bao gồm các đơn vị SimTK, có thể chính xác là chi phí thời gian chạy.
  3. Tôi muốn số lượng có kích thước tương thích với các mảng có nhiều mảng, nhưng không nhất thiết yêu cầu gói gọn gàng. Nói cách khác, số lượng có thể được dựa trên một trong hai mảng numpy hoặc trên xây dựng trong các loại python.

Tính năng nào quan trọng đối với bạn?

4

Dường như một gói khác đã được đưa ra để thực hiện việc này, được viết bởi Massimo DiPierro của web2py nổi tiếng, được gọi là Buckingham.

Cũng lưu ý, Brian đã có một cái gì đó như thế này trong một thời gian.

+0

Buckingham dường như không đầy đủ và không thể chuyển đổi từ gram đến pound ví dụ: '>>> (Số (100, dims = 'gram')) .đổi giá trị '' pound ''. giá trị ' kết quả trong 'RuntimeError: Kích thước không tương thích ' –

+1

Daniel, Lỗi cụ thể bạn đề cập đến đó là bởi vì định nghĩa bên trong cho bảng Anh là một đơn vị của lực chứ không phải khối lượng. Ngoài ra, nó chắc chắn không có danh sách đầy đủ các đơn vị được hỗ trợ. –

+0

Ahh có ý nghĩa, để thêm hỗ trợ khối lượng pound thêm ''lb': (453.592,0,0,1,0,0,0), # lb' vào danh sách' UNITS'. –

6

Lưu ý rằng quantities đã hỗ trợ rất xấu đối với nhiệt độ:

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

0 độ C không phải là 0 độ Fahrenheit. Khung của họ không hỗ trợ bất kỳ loại chuyển đổi nào không chỉ nhân với một yếu tố.

+0

Nhiệt độ là khó khăn vì có hai loại - nhiệt độ tuyệt đối/nhiệt động lực học và sự chênh lệch tương đối/nhiệt độ. Trong tuyệt đối, mọi người đều biết 0 ° F! = 0 ° C. Khi nói về chênh lệch nhiệt độ (ΔT), 0 ° F == 0 ° C. –

15

Pint gần đây đã được đưa vào thực địa. Có ai quan tâm chia sẻ kinh nghiệm của họ không? Có vẻ tốt. FYI: Có vẻ như Pint will be integrated with Uncertainties trong tương lai gần.

+3

Pint thật tuyệt vời! – canesin

+2

Tôi đang đánh giá Pint lúc tôi viết điều này và một * * 1 * lớn là nó có thể sử dụng Thập phân có nghĩa là không có lỗi làm tròn nổi funky - tất cả các libaries được đề cập dường như chỉ hoạt động trong kiểu float - http: // python-in-the-lab.blogspot.ca/2013/01/how-many-pints-do-you-want-units-in.html –

+0

Tôi không còn là +1 lớn cho Pint - trong hai ngày qua tôi đã gửi cho đến nay hai bản sửa lỗi - Tôi đang tranh luận nếu tôi thực sự cần thêm chức năng/sự phức tạp và thay vào đó chỉ có thể sử dụng một cái gì đó thẳng về phía trước như http://code.activestate.com/recipes/577652-unit-conversions-using-decimal/ –

3

Bạn có thể muốn xem gói mới có tên natu. Nó giải quyết ba vấn đề mà @ChristopherBruns liệt kê. Nó có sẵn trong PyPI.

Tôi là tác giả của gói đó và tôi đánh giá cao bất kỳ nhận xét hoặc đề xuất nào.

2

Tôi ngạc nhiên vì chưa có ai đề cập đến SymPy. SymPy là thư viện toán học biểu tượng trưởng thành và được duy trì tốt cho Python, hơn nữa là dự án NumFOCUS-sponsored.

Mô-đun có mô-đun Physics với nhiều lớp và chức năng hữu ích để "giải quyết các vấn đề trong vật lý". Phù hợp nhất với bạn, nó có một mô-đun phụ Unit chứa mọi thứ bạn cần, tôi nghĩ; chỉ cần đọc tài liệu tuyệt vời.

Các vấn đề liên quan