оператор if: имеет ли массив единицы / измерения (пинта) - PullRequest
3 голосов
/ 26 января 2020

Моя переменная C0 определяется в пинтах. UnitRegistry единицы моль / л. Мне нужно использовать его в функции, но для того, чтобы Python не вызывал меня в непоследовательных единицах для общей функции, мне нужно определить новую переменную в функции с единицами, как показано ниже.

import pint
u = pint.UnitRegistry()

C0      = [10**(-3),10**(-6),0] *u.mol/u.L

def r(c,t):
    C = c * u.mol/u.L   #Python expects c to be dimensionless
    return ν * k[3]*C0[1]*C[0] / ((k[2]+k[3])/k[1] + C[0]) #k and ν are arrays for the problem I'm working on.

Я хочу добавить оператор if, чтобы я не заканчивал с C в r (C0, t) в единицах моль ^ 2 / L ^ 2. У меня есть

def r(c,t):
    if c.dimensionless == True:
        C = c * u.mol/u.L
    else:
        C = c
    return ν * k[3]*C0[1]*C[0] / ((k[2]+k[3])/k[1] + C[0])

Но когда я запускаю это с C0, это говорит мне, что у C0 нет атрибута, называемого безразмерным. Как мне отредактировать оператор if, чтобы он работал для проверки ввода любого типа для единиц измерения?

Traceback:

File [Redacted], line 32, in <module>
    Ct = odeint(r,C0,t)

  File "C:\Users\Spencer\Anaconda3\lib\site-packages\scipy\integrate\odepack.py", line 233, in odeint
    int(bool(tfirst)))

  File [Redacted], line 24, in r
    if c.dimensionless == True:

AttributeError: 'numpy.ndarray' object has no attribute 'dimensionless'

1 Ответ

0 голосов
/ 26 января 2020

После осмотра я обнаружил, что функция pint.UnitRegistry.Quantity позволяет проверять размерность элементов без встроенного атрибута «размерность». Обратите внимание также на обратный порядок копирования и добавления единиц сверху.

def r(c,t):
    if u.Quantity(c).dimensionality == 'substance/length**3':
        C = c
    else:
        C = c   * u.mol/u.L
    return ν * k[3]*C0[1]*C[0] / ((k[2]+k[3])/k[1] + C[0])
...