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

使用linprog时触发ValueError:A_ub必须为二维数组的问题求助

使用linprog时触发ValueError:A_ub必须为二维数组的问题求助

问题描述

我在用linprog做线性规划计算的时候,一直碰到这个ValueError,但我检查了A_ub和c的尺寸,明明是一致的,实在搞不明白问题出在哪。

我的代码如下:

import numpy as np
from scipy.optimize import linprog

A_eq = np.array([[1,0,0,0,0,1], [0,1,0,-1.05,1,0], [-0.4,-0.3,1,0,-1.05,1]])
b_eq = np.array([200,100,0])
A_ub = [0,0,0,-1,-1,-1]
b_ub = -300
c = np.array([1.2, 1.3, 1.3, 0, 0, 1.05])
res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=[0, None])

运行后触发的错误:

ValueError: Invalid input for linprog: A_ub must have exactly two dimensions, and the number of columns in A_ub must be equal to the size of c


问题分析与解决方法

兄弟,问题就出在你定义的A_ub上!你现在把它写成了一维列表,但linprog明确要求A_ub必须是二维数组——哪怕你只有一行约束条件,也得用二维的结构来表示。

你看你的c是长度为6的数组,A_ub虽然元素个数刚好是6,但它是一维的,不符合linprog的输入规范。解决方法超简单,把A_ub改成二维形式就行,有两种常用方式:

  • 方式一:用np.array包裹成二维数组,多套一层括号
    A_ub = np.array([[0,0,0,-1,-1,-1]])
    
  • 方式二:直接写成嵌套列表
    A_ub = [[0,0,0,-1,-1,-1]]
    

另外还有个小细节:你的b_ub当前是单个数值,虽然linprog会自动兼容,但最好也改成一维数组或列表,比如b_ub = [-300],这样代码风格更统一,也能避免一些潜在的小问题。

修改后的完整代码示例:

import numpy as np
from scipy.optimize import linprog

A_eq = np.array([[1,0,0,0,0,1], [0,1,0,-1.05,1,0], [-0.4,-0.3,1,0,-1.05,1]])
b_eq = np.array([200,100,0])
A_ub = np.array([[0,0,0,-1,-1,-1]])
b_ub = [-300]
c = np.array([1.2, 1.3, 1.3, 0, 0, 1.05])
res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=[0, None])

这样运行应该就不会再触发这个ValueError了,你可以试试!

备注:内容来源于stack exchange,提问作者Azil559

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:34:33