Результат от вызова функции не является массивом с плавающей точкой - PullRequest
0 голосов
/ 26 декабря 2018

После моих двух предыдущих сообщений ( post1 , post 2 ) я достиг точки, где я использую scipy, чтобы найти кривую.Однако код, который я имею, выдает ошибку.

Пример файла .csv, с которым я работаю, находится в post1.Я попытался скопировать и заменить примеры из Интернета, но, похоже, он не работает.

Вот что у меня есть (файл .py)

import pandas as pd
import numpy as np
from scipy import optimize

df = pd.read_csv("~/Truncated raw data hcl.csv", usecols=['time' , '1mnaoh trial 1']).dropna()
data1 = df

array1 = np.asarray(data1)
x , y = np.split(array1,[-1],axis=1)

def func(x, a , b , c , d , e):
    return a + (b - a)/((1 + c*np.exp(-d*x))**(1/e))

popt, pcov = optimize.curve_fit(func, x , y , p0=[23.2, 30.1 , 1 , 1 , 1])

popt

Из ограниченныхисследования, которые я сделал, могут быть проблемы с массивами x и y.В заголовке указана написанная ошибка.Это minpack.error.

Редактировать: ошибка вернулась

ValueError: object too deep for desired array
Traceback (most recent call last):
  File "~/test2.py", line 15, in <module>
    popt, pcov = optimize.curve_fit(func, x , y , p0=[23.2, 30.1 , 1 , 1 , 1])
  File "~/'virtualenvname'/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 744, in curve_fit
res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "~/'virtualenvname'/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 394, in leastsq
    gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.

Спасибо.

1 Ответ

0 голосов
/ 26 декабря 2018

После разделения форма x и y имеет вид (..., 1).Это означает, что каждый их элемент сам по себе является массивом длины один.Сначала вы хотите сгладить массив, т. Е. Через x = np.flatten(x).Но я думаю, что вам не нужен раскол вообще.Вы можете просто сделать следующее

array1 = np.asarray(data1).T
x , y = array1

. Вы хотите, чтобы x и y были первым и вторым столбцами array1.Таким образом, простой способ добиться этого - сначала перенести массив.Вы также можете получить к ним доступ через [:,0] и [:,1].

...