Skip to main content
 首页 » 编程设计

python lmfit "object too deep for desired array"

2025年05月04日10del

我正在尝试 lmfit 并使用下面的示例问题。在这个例子中,我只是在系统 Ax = y 中求解 x。这里A是一个3*2的数组,y是一个3*1的数组。我已将它们全部声明为数组。

import numpy as np 
from lmfit import minimize, Parameters 
 
A = np.array([1,2,-1,3,-2,5]) 
A = A.reshape(3,2) 
y = np.array([12, 13, 21]) 
 
def residual(params, A, y, eps_y=1): 
    x = params['x'].value 
    y_hat = np.dot(A, x) 
    return (y - y_hat)/eps_y 
 
x = np.array([0,0]) 
params = Parameters() 
params.add('x', x) 
out = minimize(residual, params, args=(A,y)) 
print out.value 

运行时出现错误:“ValueError:对象对于所需数组来说太深”。 我在这里和网上发现了类似问题的实例。通常,最常引用的原因是 A、x 和 y 应该是数组而不是矩阵。同样在一些解决方案中,x 和 y 被要求保持为形状为 (len(v),) 的向量。以上已经符合这些建议,但我仍然收到“ValueError:对象对于所需数组来说太深”。

我已经浪费了相当多的时间来解决这个问题,现在被难住了。对此的任何帮助都将非常受欢迎。

请您参考如下方法:

Parameter 的文档在这里:

http://newville.github.io/lmfit-py/parameters.html#Parameter

它明确指出参数的值必须是数值,而不是任何类型的数组。所以不要这样做:

x = np.array([0,0]) 
params.add('x', x) 

做:

params.add('x0', 0) 
params.add('x1', 0) 

然后将残差函数改为:

def residual(params, A, y, eps_y=1): 
    x0 = params['x0'].value 
    x1 = params['x1'].value 
    y_hat = np.dot(A, [x0, x1]) 
    return (y - y_hat)/eps_y