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

如何基于numpy数组优化目标函数并解决scipy.brute运行TypeError问题

报错根因

错误来自参数传递的逻辑问题:
scipy.optimize.brute的args参数要求传入元组,用于给目标函数传递额外参数。你直接传入numpy数组processed时,底层会把数组按第一维拆分,传入bwp的*processed就变成了由数组每行组成的元组,而非完整的二维numpy数组。元组不支持[i, 3]这种多维索引写法,所以执行到对应代码时就抛出了类型错误。

其他潜在问题

你的循环逻辑里i从0开始遍历,当i=0时processed[i-1,4]会自动取数组最后一行的第5列,如果你不是有意要做循环移位的话,这部分逻辑不符合时间序列取前一行的业务需求。

修复方案

第一步:调整参数传递

调用brute时把processed包装成单元素元组,确保完整传入目标函数。

第二步:调整循环起始值

把循环起始值改成1,避免取i-1=-1的无效索引(若业务确实需要i=0时取数据集最后一行作为前序数据,可保留原range设置)。

第三步(可选):简化目标函数参数写法

去掉*processed的可变参数写法,直接声明为单个参数更清晰,避免后续踩坑。

修复后代码

目标函数

def bwp(x, processed):
    pred, real = x
    money = 1000
    # 循环从1开始,保证i-1是前一行的有效索引
    for i in range(1, len(processed)):
        if processed[i, 3] > pred and processed[i-1,4] > real:
            money = money + (money * processed[i, 4])
    return money * -1

优化函数

from scipy import optimize

def opt_2(processed):
    bounds = (slice(-1, 1), slice(-1, 1))
    # 注意args参数要加逗号包装成单元素元组
    resbrute = optimize.brute(bwp, ranges=bounds, args=(processed,), full_output=True, finish=optimize.fmin)
    print("最优参数:", resbrute[0])
    print("最优目标值:", resbrute[1])

内容的提问来源于stack exchange,提问作者tribo32

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:36:04