
使用 scipy 的 linprog 求解线性规划时,若传入一维列表作为 a_ub,会触发 “a_ub must have exactly two dimensions” 错误;正确做法是将其显式构造为二维数组(如单行矩阵 [[...]]),确保列数与目标向量 c 长度一致。
使用 scipy 的 linprog 求解线性规划时,若传入一维列表作为 a_ub,会触发 “a_ub must have exactly two dimensions” 错误;正确做法是将其显式构造为二维数组(如单行矩阵 [[...]]),确保列数与目标向量 c 长度一致。
在调用 scipy.optimize.linprog 时,所有约束矩阵(A_ub、A_eq)都必须是严格二维结构——即形状为 (m, n) 的数组,其中 m 是约束个数,n 是决策变量个数(也即 len(c))。常见误区是将单个不等式约束写成一维 Python 列表(如 [0,0,0,-1,-1,-1]),这在 NumPy 中被视为 1D 向量(shape (6,)),不满足 linprog 对输入维度的校验要求。
✅ 正确写法:将单个不等式约束封装为二维结构
- 使用嵌套列表:
A_ub = [[0, 0, 0, -1, -1, -1]]→ shape(1, 6) - 或显式转换为二维 NumPy 数组:
A_ub = np.array([[0, 0, 0, -1, -1, -1]]) # 推荐,类型明确
以下是修正后的完整可运行示例:
import numpy as np
from scipy.optimize import linprog
# 等式约束:3 个方程,6 个变量
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])
# 不等式约束:1 个约束,必须为二维!
A_ub = np.array([[0, 0, 0, -1, -1, -1]]) # ✅ shape (1, 6)
b_ub = -300
# 目标函数系数(最小化 c @ x)
c = np.array([1.2, 1.3, 1.3, 0, 0, 1.05])
# 变量下界为 0,无上界
bounds = [(0, None)] * len(c)
res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
print(res)
⚠️ 注意事项:
-
A_ub和A_eq的列数必须严格等于c.size(此处为 6),否则会抛出ValueError: number of columns... must be equal to the size of c; -
bounds应为长度为len(c)的元组列表(如[(0, None), (0, None), ...]),而非单个元组([0, None]会被错误解释为两个变量的边界); - 若有多个不等式约束,
A_ub应为(m, n)形状,例如两个约束写作[[...], [...]]或np.array([[...], [...]])。
掌握约束矩阵的维度规范,是高效、稳定使用 linprog 的关键基础。










