如何在Python中实现Simulink式带插值的Lookup Table(无循环)
Python实现Simulink风格二维查表(带插值)
直接用pandas读取Excel数据,搭配scipy的规则网格插值工具,就能实现无循环、支持插值的查表功能,完全符合需求。
先装依赖
执行下面的命令安装所需库:
pip install pandas scipy openpyxl
完整代码
import pandas as pd from scipy.interpolate import RegularGridInterpolator def lookup_efficiency(speed_input, torque_input, excel_path): # 读取Excel,把首列设为索引(扭矩列) df = pd.read_excel(excel_path, index_col=0) # 提取转速向量、扭矩向量和效率矩阵,转成浮点型避免类型问题 speed_vec = df.columns.values.astype(float) torque_vec = df.index.values.astype(float) efficiency_matrix = df.values.astype(float) # 创建插值器:输入网格是(扭矩, 转速),对应效率矩阵 interpolator = RegularGridInterpolator( points=(torque_vec, speed_vec), values=efficiency_matrix, bounds_error=False, # 输入超出表格范围时不抛出错误 fill_value=None # 超出范围返回nan,也可以设为0/边缘值等 ) # 构造输入点,注意顺序要和points参数一致(扭矩在前,转速在后) input_pair = (torque_input, speed_input) # 计算插值结果并返回单个数值 return interpolator(input_pair).item()
使用示例
假设你的Excel文件efficiency_map.xlsx结构是这样的:
| Torque | 1000 | 2000 | 3000 |
|---|---|---|---|
| 50 | 0.85 | 0.88 | 0.82 |
| 100 | 0.87 | 0.90 | 0.84 |
| 150 | 0.83 | 0.86 | 0.80 |
调用函数测试:
# 精确匹配表格数据的情况 print(lookup_efficiency(2000, 100, "efficiency_map.xlsx")) # 输出0.90 # 需要插值的中间值 print(lookup_efficiency(1500, 75, "efficiency_map.xlsx")) # 输出线性插值后的效率值 # 超出表格范围的输入 print(lookup_efficiency(5000, 200, "efficiency_map.xlsx")) # 输出nan
关键细节
- 无循环:
RegularGridInterpolator内部用向量化运算处理插值,全程不需要手动写循环,效率拉满。 - 插值方式:默认是线性插值,想换的话可以给
method参数传'nearest'(最近邻)或'cubic'(三次插值)。 - 边界控制:如果不想允许超出范围的输入,把
bounds_error改成True,超出时直接抛错;fill_value可以设成你想要的默认值,比如表格里的最小/最大效率。
内容的提问来源于stack exchange,提问作者Serhiy Kapustyan
相关产品推荐
相关产品推荐

