Python / curve_fit: невозможно передать массив с предположением инициализации - PullRequest
0 голосов
/ 04 марта 2019

У меня есть эта функция для вычисления некоторого рода полинома:

def pipoly(df,pj):
    n=np.size(pj)
    p=pj[0]
    for j in range(1,n):
        p+=pj[j]*df**j
    return p

pj должен быть массивом, который содержит начальные догадки коэффициентов полинома;следовательно, степень многочлена определяется самой функцией в первой строке.df - скалярная переменная.Эта функция передается в curve_fit scipy.optimize как

parfit,covfig=curve_fit(pipoly,[f-f0[j] for f in f_df[if0[j]:if0[i]]],
                            pmode_xp[ph][if0[j]:if0[i]],
                            p0=([pmode0[ph][-1],(pmode_xp[ph][if0[i]]-pmode_xp[ph][if0[j]])/df]))

Первые два аргумента после имени функции являются массивами (1D-срезы 2D-массивов), и я подтвердил, что они имеют одинаковыедлина.Третий аргумент после pipoly должен быть кортежем с начальными догадками для pj, которые я распечатал раньше: [0.4586590267346888, 0.7419930843896957].Так почему же Python жалуется на TypeError: pipoly() takes 2 positional arguments but 3 were given?И если я уберу аргумент p0, мне скажут, что pj считается скаляром и поэтому не может иметь индекс.Как мне объяснить пиполии, что pj должен быть массивом?

1 Ответ

0 голосов
/ 04 марта 2019

Ваше утверждение:

pj должен быть массивом, содержащим коэффициенты полинома;

неверно.В соответствии с curve_fit () документами :

scipy.optimize.curve_fit (f, xdata, ydata, p0 = None, sigma = None, absolute_sigma = False, check_finite = True,bounds = (- inf, inf), method = None, jac = None, ** kwargs) [source] Использовать нелинейные наименьшие квадраты для подгонки функции f к данным.

Предполагается, ydata = f (xdata, * params) + eps

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

TypeError: pipoly () занимает 2 позиционныеаргументов, но было дано 3?

говорит вам, что pipoly получает 3 аргумента, потому что вы, вероятно, тестировали линейный полиномиал, поэтому три аргумента были независимой переменной и двумя параметрами ([f-f0[j] for f in f_df[if0[j]:if0[i]]]вещи - это список длиной 2).
Когда вы пишете, вместо него требуется только 2 аргумента.

Вы можете легко решить свою проблему, добавив звездочку перед pj:

def pipoly(df,*pj):
    n=len(pj) #len() is sufficient here, but np.size() works too.
    p=pj[0]
    for j in range(1,n):
        p+=pj[j]*df**j
    return p

Таким образом, ваша функция принимает переменное количество аргументов. Здесь подробнее о значении и использовании звездочки в параметрах функции python.

...