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

使用Numpy求解线性方程组遇ValueError报错求助

解决Numpy求解超定线性方程组的报错问题

咱先拆解你遇到的两个核心问题:

1. 数组A的创建语法出错

你写的A = np.array([-950],[-550],[-250])犯了个小语法错误——np.array()只接受一个主要的数组参数(比如一个嵌套列表),你却把三个独立的列表当成了三个位置参数传进去,这就触发了ValueError: only 2 non-keyword arguments accepted的报错。

正确的创建方式应该把所有元素放进一个大列表里,生成3行1列的二维系数矩阵:

A = np.array([[-950], [-550], [-250]])

2. 用错了求解函数

你的方程组是超定方程组:3个方程,却只有1个未知数X(虽然X是3D数组,但每个位置的元素都是独立求解的)。而np.linalg.solve()只适用于方阵且可逆的情况(也就是n个方程对应n个未知数),显然这里不符合条件。

对于超定方程组,我们需要用最小二乘法来找到最优解(最小化所有方程的残差平方和),Numpy里有现成的工具可以用:

方法一:使用np.linalg.lstsq()

这是最直接的最小二乘求解方法,代码示例如下:

import numpy as np

# 假设你的3D数据已经定义好:b1000_data, b600_data, b300_data, b50_data
A = np.array([[-950], [-550], [-250]])
B = np.array([
    np.log(b1000_data / b50_data),
    np.log(b600_data / b50_data),
    np.log(b300_data / b50_data)
])

# 执行最小二乘求解,rcond=None是为了适配最新的Numpy版本
X, residuals, rank, singular_values = np.linalg.lstsq(A, B, rcond=None)
# 去掉多余的维度,得到和输入数据同形状的3D数组X
X = X.squeeze()

方法二:使用伪逆求解

伪逆np.linalg.pinv()也能得到和最小二乘一致的结果,写法更简洁:

X = np.linalg.pinv(A) @ B
X = X.squeeze()

两种方法都会自动处理3D数组的每个元素,不需要你手动循环,非常高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:48:22