3

如何在 Pint 中测试单位等效性?例如,nM等价于nmol/LL等价于dm^3,但根据品脱,它们不相等。我不想要 Pint 通过该is_compatible_with方法提供的兼容性。例如,s与 兼容ms,但它们不等价。

import pint
ureg = pint.UnitRegistry()

nM = ureg.Unit('nM')
nmol_L = ureg.Unit('nmol/L')
m = ureg.Unit('m')
ft = ureg.Unit('ft')

nM == nmol_L  # False
m == ft  # False

nM.is_compatible_with(nmol_L)  # True
m.is_compatible_with(ft)  # True

# What operation does this?
# nM equivalent to nmol  # Should be True
# m equivalent to ft  # Should be False
4

2 回答 2

0

一种解决方法是将单位转换为数量,取它们的比率,将其降为基本单位,然后测试该数量是无量纲的并且其数量等于 1。请注意,由于舍入误差,您不能只做正则等于;你需要做一个大约等于并希望你永远不会遇到任何单位几乎完全相同,但不完全一样。

from math import isclose
import pint
ureg = pint.UnitRegistry()

nM = ureg.Unit('nM')
nmol_L = ureg.Unit('nmol/L')
m = ureg.Unit('m')
ft = ureg.Unit('ft')

def is_equivalent(first: pint.Unit, second: pint.Unit):
    ratio = ((1 * first) / (1 * second)).to_base_units()
    return ratio.dimensionless and isclose(ratio.magnitude, 1)

is_equivalent(nM, nmol_L)  # True
is_equivalent(m, ft)  # False
于 2021-10-19T21:08:05.960 回答
0

一种解决方法是使用该UnitRegistry.convert(number, current_unit, new_unit)方法。如果您尝试将 1 从一个单位转换为另一个单位,如果单位相等,结果仍将为 1。DimensionalityError如果单位不兼容,它将引发错误。请注意,由于舍入误差,您不能只对 1 进行常规等于;你需要做一个大约等于并希望你永远不会遇到任何单位几乎完全相同,但不完全一样。

from math import isclose
import pint
ureg = pint.UnitRegistry()

nM = ureg.Unit('nM')
nmol_L = ureg.Unit('nmol/L')
m = ureg.Unit('m')
ft = ureg.Unit('ft')

def is_equivalent(first: pint.Unit, second: pint.Unit):
    try:
        factor = ureg.convert(1, first, second)
    except pint.DimensionalityError:
        return False
    return isclose(factor, 1)

is_equivalent(nM, nmol_L)  # True
is_equivalent(m, ft)  # False

请注意,没有记录表明提供 a 是合法pint.Unitconvert

于 2021-10-20T14:50:26.610 回答