Vikas Jain
Vikas Jain

Reputation: 23

python lmfit "object too deep for desired array"

I am trying out lmfit and using as an example problem below. In this example, I am simply solving for x in a system Ax = y. Here A is a 3*2 array, y is a 3*1 array. I have declared all of them as arrays.

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

When running this I get an error: "ValueError: object too deep for desired array". I have found instances of similar problems researching here and on web. In general, most often reason cited is that A, x and y should be arrays and not matrix. Also in some solutions, x and y are asked to be a kept as a vector with shape (len(v),). Above is already in compliance with these suggestions but I am still getting "ValueError: object too deep for desired array".

I have wasted quite a bit of time trying to solve this problem and am stumped now. Any help on this will be very welcome.

Upvotes: 2

Views: 1779

Answers (1)

Ashwin Iyengar
Ashwin Iyengar

Reputation: 395

The documentation for Parameter is here:

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

It specifically states that the value of a parameter must be a numerical value, and not an array of any kind. So instead of doing:

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

do:

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

and then change the residuals function to:

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

Upvotes: 1

Related Questions