Невозможно подогнать данные из-за невозможности умножить последовательность на ошибку, отличную от int типа 'numpy.float64'

Я пытаюсь сопоставить и построить простые данные в файле .txt с линейной функцией (a*x+b), используя matplotlib и scipy. Я столкнулся с ошибкой, касающейся тестовой функции: "can't multiply sequence by non-int of type 'numpy.float64'"

Я попытался изменить имя переменной x, но у меня возникла та же проблема. Большая часть кода взята из работающего кода, который без проблем подходит к данным и использует то же определение для тестовой функции.

import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
f=open("testData.txt","r")
x_data=[]
y_data=[]
trash=f.readline() #discards first line
for line in f: #reads x and y data from file
    x_read,y_read=line.split()
    x_data.append(float(x_read))
    y_data.append(float(y_read))

def test_func(x, a, b):
    return a*x+b

params, params_covariance = optimize.curve_fit(test_func, x_data, y_data, 
p0=[1, 1])
plt.figure(figsize=(6, 4))
plt.scatter(x_data, y_data)
plt.plot(x_data, test_func(x_data, params[0], params[1]), label='Fitted 
function')
plt.show()

Это ошибка:

Traceback (последний последний вызов):

Файл "C:/Users/Fra/Desktop/lab/ottica/2/reaqd.py", строка 19, в plt.plot(x_data, test_func(x_data, params[0], params[1]), label=' Подогнанная функция')

Файл "C:/Users/Fra/Desktop/lab/ottica/2/reaqd.py", строка 14, в test_func возвращает a*x+b

TypeError: невозможно умножить последовательность на не-int типа 'numpy.float64'


person Francesco Pettini    schedule 18.04.2019    source источник
comment
Превратите свои списки в numpy ndarrays, прежде чем передавать их в test_func.   -  person 9769953    schedule 18.04.2019


Ответы (2)


Вы, вероятно, пытаетесь умножить список Python на число с плавающей запятой, что не работает. Попробуйте a*np.array(x)+b

person Jussi Nurminen    schedule 18.04.2019
comment
Спасибо, это сработало. Я не совсем понимаю, почему это работает, разве переменная x не должна вести себя как число с плавающей запятой? - person Francesco Pettini; 18.04.2019
comment
@FrancescoPettini нет, в вашем коде x - это список Python. Умножение списков Python на числа с плавающей запятой не определено, поскольку они могут содержать произвольные объекты (не только числа). - person Jussi Nurminen; 18.04.2019
comment
Обратите внимание, что это медленнее, чем непосредственное изменение исходного списка в массив numpy перед подгонкой и построением графика. Теперь при каждом вызове функции список заменяется массивом NumPy со всеми накладными расходами. Для жестких (читай: медленных) функций и больших списков это может заметно замедлить работу. - person 9769953; 18.04.2019

Поскольку вы спрашиваете о том, как работает принятый ответ, показ «старой школы» может иметь свое применение:

plt.plot(x_data, 
  [test_func(x, params[0], params[1]) for x in x_data],
  label='Fitted function')

x_data = [] явно является списком, а поскольку Python не является Matlab, number*x_data не является поэлементным умножением, а создает список, который повторяется x_data, number раз, для которого требуется целое число.

person tevemadar    schedule 18.04.2019