【问题标题】:Unable to fit data due to "can't multiply sequence by non-int of type 'numpy.float64'" error由于“无法将序列乘以‘numpy.float64’类型的非整数”错误,无法拟合数据
【发布时间】:2019-09-08 13:24:57
【问题描述】:

我正在尝试使用 matplotlib 和 scipy 在具有线性函数 (a*x+b) 的 .txt 文件中拟合和绘制简单数据。我遇到了有关测试功能的错误:"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: 不能将序列乘以“numpy.float64”类型的非整数

【问题讨论】:

  • 在将列表传递给 test_func 之前将它们转换为 numpy ndarray。

标签: python matplotlib scipy data-fitting function-fitting


【解决方案1】:

您可能正在尝试将 Python 列表乘以浮点数,但这是行不通的。试试a*np.array(x)+b

【讨论】:

  • 谢谢,它成功了。我不太明白它为什么起作用,“x”变量的行为不应该像浮点数吗?
  • @FrancescoPettini 不,在您的代码中 x 是一个 Python 列表。 Python 列表与浮点数的乘法没有定义,因为它们可以包含任意对象(不仅仅是数字)。
  • 请注意,这比在拟合和绘图之前直接将初始列表更改为 numpy 数组要慢。现在,每次调用该函数时,列表都会更改为一个 NumPy 数组,其中包含所有开销。对于很难(阅读:慢)适应函数和大型列表,这可能会显着减慢速度。
【解决方案2】:

当您询问接受的答案如何工作时,显示“老派”方式可能有其用途:

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_datanumber 次的列表,这需要一个整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多