Brightway替换LCA特征因子遇InconsistentGlobalIndex错误求助
InconsistentGlobalIndex错误及结果不更新问题 问题场景
尝试通过datapackage指定新值修改LCA特征因子(C矩阵),执行代码时触发错误:
import bw2data as bd import bw_processing as bwp import numpy as np import bw2calc as bc mobility_db = bd.Database('Mobility example') combustion_car_driving = mobility_db.get(name='Driving an combustion car') co2 = mobility_db.get(name='CO2') # create datapackage with alternative values for the GWP of CO2 indices_array = np.array([(co2.id,co2.id)],dtype=bwp.INDICES_DTYPE) values_array = np.array([[10,12]]) dp_c = bwp.create_datapackage() dp_c.add_dynamic_array( matrix='characterization_matrix', indices_array=indices_array, interface=values_array, ) fu, data_objs , _ = bd.prepare_lca_inputs({combustion_car_driving:1}, method=('IPCC','simple')) lca = bc.LCA(demand=fu, method=('IPCC','simple'), data_objs=data_objs+[dp_c], use_arrays=True) lca.lci() lca.lcia()
触发错误
InconsistentGlobalIndex错误:Multiple global index values found: [1, None]. If multiple LCIA datapackages are present, they must use the same value for
GLO, the global location, in order for filtering for site-generic LCIA to work correctly
手动添加bd.method.geomapping[bd.method.config.global_location]作为global_index后计算可继续,但next(lca)结果始终不变。
问题分析与解决
1. InconsistentGlobalIndex错误修复
当同时加载原LCIA方法的datapackage和自定义datapackage时,两者必须共享相同的global_index(全局位置GLO的索引值),否则会触发位置过滤一致性校验。
修复方式:创建自定义datapackage时,显式指定与原方法一致的global_index值,直接通过bd.method.geomapping[bd.method.config.global_location]获取即可。
2. 结果不更新的核心原因
你的indices_array结构错误:characterization_matrix(C矩阵)的索引格式应为(生物流ID, LCIA方法类别ID),而非(生物流ID, 生物流ID)。原方法的特征因子绑定到特定方法类别,错误索引会导致自定义值无法匹配正确计算维度,自然不会影响结果。
修正后的完整代码
import bw2data as bd import bw_processing as bwp import numpy as np import bw2calc as bc # 加载基础对象 mobility_db = bd.Database('Mobility example') combustion_car_driving = mobility_db.get(name='Driving an combustion car') co2 = mobility_db.get(name='CO2') method_key = ('IPCC', 'simple') # 获取LCIA方法关键参数 method = bd.Method(method_key) _, method_data = method.load() # 获取方法对应的类别ID(单类别方法取第一个因子的类别ID即可) category_id = bd.MethodCategory(method_data[0][1]).id # 获取全局位置索引 global_index = bd.method.geomapping[bd.method.config.global_location] # 创建正确的自定义datapackage indices_array = np.array([(co2.id, category_id)], dtype=bwp.INDICES_DTYPE) values_array = np.array([[10, 12]]) dp_c = bwp.create_datapackage(global_index=global_index) dp_c.add_dynamic_array( matrix='characterization_matrix', indices_array=indices_array, interface=values_array, # 设置kind='replace'替换原特征因子,默认kind='add'为叠加值 kind='replace' ) # 执行LCA计算 fu, data_objs, _ = bd.prepare_lca_inputs({combustion_car_driving: 1}, method=method_key) lca = bc.LCA( demand=fu, method=method_key, data_objs=data_objs + [dp_c], use_arrays=True ) lca.lci() lca.lcia() # 查看结果 print("LCIA Score:", lca.score) # 动态参数场景下迭代查看结果 for score in lca: print("Dynamic Score:", score)
关键修正点
- 全局索引一致性:创建datapackage时通过
global_index参数指定与原方法一致的全局位置索引,避免校验错误。 - 索引结构正确:将
indices_array的第二个元素改为LCIA方法的类别ID,确保自定义特征因子匹配正确计算维度。 - 值的替换/叠加:通过
kind='replace'设置自定义值完全替换原特征因子,默认kind='add'会计算原因子与自定义值的总和。
内容的提问来源于stack exchange,提问作者mfastudillo

