передача массива для подгонки определяемой пользователем функции в python

#python #arrays #scikit-learn

#python #массивы #scikit-learn

Вопрос:

Я пытаюсь подгонять пользовательскую функцию с помощью функции scipy.optimize.curve_fit и сталкиваюсь с этой ошибкой:

 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().
 

Ошибка связана со строкой кода, в которой использовалась функция min() , и я понял, что эта проблема не ограничивается функцией min() . Например, учитывая простую функцию:

 def func2(x,a,b):
    m=2
    if x>5:
        return(m*a*b)
    else:
        return(x*a*b)
 

Я могу воспроизвести тот же код ошибки, если передам массив функции:

 x1=np.array([2,3,4,5,6])
func2(x1,1,1)
 

По-видимому, когда x1 передается функции, она принимает весь список и вызывает сравнение по ‘>’ ValueError, поскольку он ожидает, что реальное значение будет сравниваться с номером 5 в моем примере.

Чтобы обойти эту проблему, пользовательскую функцию можно запускать без ошибок в виде списка:

 [func2(i,1,1) for i in x1]
 

это дает ожидаемый результат:

 [2, 3, 4, 5, 2]
 

Моя проблема в том, что я не могу использовать это понимание списка в функции curve_fit. Мои независимые и зависимые значения должны передаваться как массивы, и я должен использовать строку сравнения (я использовал функцию min (), с тем же эффектом, что и мой пример кода здесь) в моей функции.

Любое понимание этой конкретной проблемы очень ценится.

Ответ №1:

Вы можете использовать np.where, условие, за которым следует, что возвращать, если true, и что возвращать, если false:

 def func2(x,a,b):
    m=2
    return np.where(x>5,m*a*b,x*a*b)
 

Комментарии:

1. Спасибо. Я включил функцию np.where в curve_fit и работал, если я передаю массив в качестве входных данных. Единственная проблема заключается в том, что функция выдает ошибку типа, если я использую число в качестве входных данных. Я включил дополнительный цикл if-else, чтобы перехватить эту ошибку.