如何使用Skfuzzy批量处理数组输入以计算脆弱性值?
使用Skfuzzy批量处理数组输入计算脆弱性值
问题背景
我正在用Skfuzzy处理两个数组:
- 到溪流的距离数组
dist - Strahler级数数组
order
希望借助自定义的前件、后件隶属度值,为每一组距离与Strahler级数的配对计算对应的脆弱性值。目前程序仅支持单个输入值的计算,不清楚如何让Skfuzzy循环处理数组输入,输出每对值对应的后件结果。
现有代码与报错
控制系统代码
# Creation of control system using the defined rules vulnerability_ctrl = ctrl.ControlSystem([rule1, rule2, rule3]) vulnerability = ctrl.ControlSystemSimulation(vulnerability_ctrl)
错误的输入计算代码
# input of distance and Strahler order arrays vulnerability.input[dist] vulnerability.input[order] vulnerability.compute()
报错信息
TypeError: '_InputAcceptor' object is not subscriptable
解决方案
vulnerability.input是Skfuzzy的_InputAcceptor对象,不支持直接用下标赋值数组,必须通过循环逐个处理每一对输入值:
实现步骤
- 确保
dist和order是长度一致的数组(Python列表或Numpy数组均可) - 遍历每一对输入值,逐个传入仿真对象计算
- 收集每一次计算的结果
示例代码
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl # 假设已完成模糊变量(前件、后件)和规则(rule1/rule2/rule3)的定义 # 初始化控制系统与仿真实例 vulnerability_ctrl = ctrl.ControlSystem([rule1, rule2, rule3]) vulnerability = ctrl.ControlSystemSimulation(vulnerability_ctrl) # 替换为你的实际输入数组 dist = np.array([10, 20, 30, 40]) order = np.array([1, 2, 3, 2]) # 存储结果的容器 vulnerability_results = [] # 循环处理每一组输入 for d, o in zip(dist, order): # 传入单个输入值(注意替换为你定义的模糊变量名称) vulnerability.input['distance'] = d vulnerability.input['strahler_order'] = o # 执行模糊计算 vulnerability.compute() # 提取结果并保存 vulnerability_results.append(vulnerability.output['vulnerability']) # 输出所有配对的脆弱性值 print(vulnerability_results)
关键注意事项
- 务必将代码中的
distance、strahler_order、vulnerability替换为你实际定义的模糊变量名称 - Skfuzzy无内置批量处理接口,循环是最直接的实现方式
- 无需每次循环重新创建
ControlSystemSimulation对象,复用同一个实例即可,每次compute()后会自动重置状态
内容的提问来源于stack exchange,提问作者GEobserver
相关产品推荐
相关产品推荐

