0

我不断收到“无法使用不同注册表的数量和数量进行操作”。错误,我不知道为什么。在下面的代码片段中,Pint 创建了一个用于填充常量/流体字典的注册表。当我从数字数据创建 DataFrame 时,Pint 使用不同的注册表......我不知道为什么。

抱歉,MWE 有点长。底部的循环/方程式是引发错误的原因,但我添加了一些打印语句来检查单元注册表,它们确实不同......帮助?

编辑:如果我重新启动内核 Pint 只使用一个注册表。但是在任何后续运行中,即使我清除了变量,我也会得到两个不同的注册表。我不确定这是否对任何人都有帮助,但这是更多信息。我希望程序只使用一个注册表,即使我在同一个内核中多次运行它....

from __future__ import print_function, absolute_import, division
import pandas as pd
import pint # Units
import pint_pandas as ppi

# Unit Registry
ureg = pint.UnitRegistry(auto_reduce_dimensions=False)
pint.set_application_registry(ureg)
ppi.PintType.ureg = ureg
ppi.PintType.ureg.default_format = "~P"

# Constants and Parameters
#Acceleration Due to Gravity
g = 1.0 * ureg.g_0
g.ito(ureg.foot / ureg.second**2 ) # ft/s2

print('Constants Dictionary Unit Registries')
print('g: ', id(g._REGISTRY))

# Constants Dict
const_dict = {}
const_dict['g'] = g
const_dict['SL_LB'] = 1.0*ureg.slug/(1.0*ureg.slug).to(ureg.pound) # slug/lb
const_dict['rho'] = 68.48 * ureg.pound / ureg.foot**3  #lbMass/ft^3
const_dict['eta'] = 0.6644 * ureg.centipoise

# Check registry of constants dictionary
cdg = const_dict['g']
print('cdg: ', id(cdg._REGISTRY))

# Fluid Dict
fluid_dict = {}
fluid_dict['Dens_SL'] = const_dict['rho'] * const_dict['SL_LB'] # slugs/ft3
fluid_dict['DynVisc_LBFT2'] = const_dict['eta'].to(ureg.force_pound * ureg.second / ureg.foot**2) #lbF-s/ft2

# Check registry of fluid dictionary
fdex = fluid_dict['Dens_SL']
print('Fluid Dictionary Unit Registries')
print('fdex: ', id(fdex._REGISTRY))

# Small segment of the input data
Dij = [4.0]*4
Lij = [2000.0]*4
data = {'Dij': Dij, 'Lij': Lij}
arc = pd.DataFrame(data=data)

# Put Data into DataFrame
df = pd.DataFrame({
        "Dij": ppi.PintArray(arc['Dij'], dtype=ureg.inch),
        "Lij": ppi.PintArray(arc['Lij'], dtype=ureg.foot)
    }, index=arc.index)

print('DataFrame Unit Registries')
ID = df.at[0,'Dij']
print('ID: ', id(ID._REGISTRY))

v = list(range(1,3))
vels = ppi.PintArray(v, dtype=ureg.foot/ureg.second)

# Check registry of Pint Array content
vt=vels[0]
print('V: ', id(vt._REGISTRY))

vvels = [vels]*len(arc)
vv = list(zip(arc.index.values, vvels))
vd = dict(vv)
pwdf = pd.DataFrame(vd, index=v)
pwdf2 = pwdf.T

# Breaks here....
#for y in vels:
#    ReNumb = y * ID * fluid_dict['Dens_SL'] / fluid_dict['DynVisc_LBFT2']
#    ReNumb.ito_reduced_units()
#    print(ReNumb)

这将创建以下输出:

Constants Dictionary Unit Registries
g:  140211922283536
cdg:  140211922283536
Fluid Dictionary Unit Registries
fdex:  140211922283536
DataFrame Unit Registries
ID:  140211870589664
V:  140211870589664

很明显,实际的注册表 NUMBERS 有时会在代码执行之间发生变化,但是,最重要的是,前三个总是与后两个不同......

4

1 回答 1

0

显然,如果我使用 get_application_registry 而不是 set_application_registry,它可以正常工作。我真的不明白为什么,因为品脱网站上的示例是:

from pint import UnitRegistry, set_application_registry
ureg = UnitRegistry()
set_application_registry(ureg)

但是,是的,“set”对我不起作用……我需要使用“get”。

ureg = pint.get_application_registry()
于 2021-06-22T19:09:06.180 回答