You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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结构是这样的:

Torque100020003000
500.850.880.82
1000.870.900.84
1500.830.860.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:25:30