我有一组测量曲线(表示为x的数组和y值的数组)。我需要计算这个集合的平均曲线。 该组中的曲线可以在采样点的数量(x值)和采样点的位置两者上变化。
我首先使用scipys interp1d线性插入每条曲线。然后,我确定所有曲线重叠的x值范围,以便定义插值函数。最后我需要计算平均值,这就是我被困住的地方。
答案 0 :(得分:2)
我担心你的问题在概念上比编码相关。但是,以下示例可以帮助您:
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
# make up three datasets for testing
x1 = np.linspace(0, 10, num=11, endpoint=True)
x2 = np.linspace(0, 10, num=13, endpoint=True)
x3 = np.linspace(0, 10, num=23, endpoint=True)
y1 = np.cos(-x1**2/9.0) + 0.2*np.random.rand((len(x1)))
y2 = np.cos(-x2**2/9.0) + 0.2*np.random.rand((len(x2)))
y3 = np.cos(-x3**2/9.0) + 0.2*np.random.rand((len(x3)))
# interpolate data
f1 = interp1d(x1, y1,'cubic')
f2 = interp1d(x2, y2,'cubic')
f3 = interp1d(x3, y3,'cubic')
# define common carrier for calculation of average curve
x_all = np.linspace(0, 10, num=101, endpoint=True)
# evaluation of fits on common carrier
f1_int = f1(x_all)
f2_int = f2(x_all)
f3_int = f3(x_all)
# put all fits to one matrix for fast mean calculation
data_collection = np.vstack((f1_int,f2_int,f3_int))
# calculating mean value
f_avg = np.average(data_collection, axis=0)
# plot this example
plt.figure()
plt.hold('on')
plt.plot(x1,y1,'ro',label='row1')
plt.plot(x2,y2,'bo',label='row2')
plt.plot(x3,y3,'go',label='row3')
plt.plot(x_all,f1_int,'r-',label='fit1')
plt.plot(x_all,f2_int,'b-',label='fit2')
plt.plot(x_all,f3_int,'g-',label='fit3')
plt.plot(x_all, f_avg,'k--',label='fit average')
plt.legend(loc=3)
plt.hold('off')
plt.show()
最重要的行是使用np.vstack
组合测量值和np.average
来测量平均值的行。其余的只是一个有效的例子!
编辑: 对于适合的非等距载体,例如以下内容:
# define common carrier for calculation of average curve
x_all_1 = np.linspace(0, 1, num=101, endpoint=True)
x_all_2 = np.linspace(1, 10, num=21, endpoint=True)
x_all = np.concatenate((x_all_1, x_all_2))