这是我的代码:
for i in range(-area,area):
stDev1= []
for j in range(-area,area):
stDev0 = stDev[i+i0][j+j0]
stDev1.append(stDev0)
slices[i] = stDev1
fitV = []
xV = []
for l in range(-area,area):
y = np.asarray(slices[l])
x = np.arange(0,2*area,1)
for m in range(-area,area):
fitV.append(slices[m][l])
xV.append(l)
fit = np.polyfit(xV,fitV,4)
yfit = function(fit,area)
x100 = np.arange(0,100,1)
plt.plot(xV,fitV,'.')
plt.savefig("fits1.png")
def function(fit,area):
yfit = []
for x in range(-area,area):
yfit.append(fit[0]+fit[1]*x+fit[2]*x**2+fit[3]*x**3+fit[4]*x**4)
return(yfit)
i0 = 400
j0 = 400
area = 50
stdev = 2d np.array([1300][800]) #just an image of "noise" feel free to add any image // 2d np array you like.
显然这是完全错误的吗?
我想我错过了理解polyfit的概念?从文档的要求是我用两个形状x [i] y [i]的数组喂它? 中的我的价值观
xV = [ x_1_-50,x_1_-49,...,x_1_49,x_2_-50,...,x_49_49]
我的是:
fitV = [y_1_-50,y_1_-49,...,y_1_49,...y_2_-50,...,y_2_49]
答案 0 :(得分:1)
我不完全了解你的程序。将来,如果您将问题提炼为MCVE,将会很有帮助。但这里有一些想法:
在您的数据中,对于给定的 x 值,似乎有多个 y 值。给定( x , y )数据,polyfit
返回表示多项式函数的元组,但没有函数可以映射单个 x 的值为 y 的多个值。作为第一步,考虑使用例如均值,中值或模式将每组 y 值折叠成单个代表值。或者,或许,在您的域中,有一种更自然的方式来做到这一点。
其次,使用这对函数np.polyfit
和np.polyval
的惯用方法,并且您不会以标准方式使用它们。当然,存在许多有用的偏离这种模式,但首先要确保你理解这两个函数的基本模式。
一个。根据您在 x_data 的时间或地点拍摄的测量 y_data ,绘制它们并猜测拟合的顺序。那就是它看起来像一条线?像抛物线?让我们假设您认为您的数据是抛物线的,并且您将使用二阶多项式拟合。
湾确保按照增加x
的顺序对数组进行排序。有很多方法可以做到这一点,但np.argsort
很简单。
℃。运行polyfit
:p = polyfit(x_data,y_data,2)
,它返回包含p
,(c2,c1,c0)
中的第2,第1和第0阶系数的元组。
d。在习惯使用polyfit
和polyval
时,接下来您将生成适合度:polyval(p,x_data)
。或者您可能希望更粗略或精细地对拟合进行采样,在这种情况下,您可以采用x_data
的子集或在x_data
中插入更多值。
下面是一个完整的例子。
import numpy as np
from matplotlib import pyplot as plt
# these are your measurements, unsorted
x_data = np.array([18, 6, 9, 12 , 3, 0, 15])
y_data = np.array([583.26347805, 63.16059915, 100.94286909, 183.72581827, 62.24497418,
134.99558191, 368.78421529])
# first, sort both vectors in increasing-x order:
sorted_indices = np.argsort(x_data)
x_data = x_data[sorted_indices]
y_data = y_data[sorted_indices]
# now, plot and observe the parabolic shape:
plt.plot(x_data,y_data,'ks')
plt.show()
# generate the 2nd order fitting polynomial:
p = np.polyfit(x_data,y_data,2)
# make a more finely sampled x_fit vector with, for example
# 1024 equally spaced points between the first and last
# values of x_data
x_fit = np.linspace(x_data[0],x_data[-1],1024)
# now, compute the fit using your polynomial:
y_fit = np.polyval(p,x_fit)
# and plot them together:
plt.plot(x_data,y_data,'ks')
plt.plot(x_fit,y_fit,'b--')
plt.show()
希望有所帮助。