为啥品脱要创建第二个注册表?
Posted
技术标签:
【中文标题】为啥品脱要创建第二个注册表?【英文标题】:Why is Pint creating a second registry?为什么品脱要创建第二个注册表? 【发布时间】:2021-09-03 15:02:27 【问题描述】:我不断收到“无法使用不同注册表的数量和数量进行操作”。错误,我不知道为什么。在下面的代码 sn-p 中,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 有时会在代码执行之间发生变化,但归根结底,前三个总是与后两个不同...
【问题讨论】:
【参考方案1】:显然,如果我使用 get_application_registry 而不是 set_application_registry,它可以正常工作。我真的不明白为什么,因为 Pint 网站上的示例是:
from pint import UnitRegistry, set_application_registry
ureg = UnitRegistry()
set_application_registry(ureg)
但是,“set”对我不起作用……我需要使用“get”。
ureg = pint.get_application_registry()
【讨论】:
以上是关于为啥品脱要创建第二个注册表?的主要内容,如果未能解决你的问题,请参考以下文章