Python 给定段和系数的快速三次样条输出计算?
我有一个三次样条激活函数,有6段。断裂(长度=7(6+1))和系数已知(形状=(6L,4L))。此三次样条曲线作用于相对于断点的输入,而不是绝对值。以下是我的输出计算方法和一些示例数据:Python 给定段和系数的快速三次样条输出计算?,python,numpy,Python,Numpy,我有一个三次样条激活函数,有6段。断裂(长度=7(6+1))和系数已知(形状=(6L,4L))。此三次样条曲线作用于相对于断点的输入,而不是绝对值。以下是我的输出计算方法和一些示例数据: def CubSpline(cs,x): breaks=cs['breaks'] coefs=cs['coefs'] pieces=cs['pieces'] if x <= breaks[0] : return coefs[0][3] elif x >= b
def CubSpline(cs,x):
breaks=cs['breaks']
coefs=cs['coefs']
pieces=cs['pieces']
if x <= breaks[0] :
return coefs[0][3]
elif x >= breaks[pieces] :
ind=pieces-1
diff=breaks[ind+1]-breaks[ind]
else :
ind=0
while x > breaks[ind+1] :
ind += 1
diff=x-breaks[ind]
y=coefs[ind][3]+coefs[ind][2]*diff + coefs[ind][1]*diff*diff + coefs[ind][0]*diff*diff*diff
return y
vcubspline=np.vectorize(CubSpline)
breaks=5*np.sort(np.random.randn(7))
coefs=np.random.randn(6,4)
pieces=6
cs=dict()
cs['pieces']=pieces
cs['breaks']=breaks
cs['coefs']=coefs
arr=np.random.randint(10,size=(500,500))
start=time.clock()
a=vcubspline2(cs,arr)
print a.shape
stop=time.clock()
print stop-start
def三次样条曲线(cs,x):
breaks=cs['breaks']
coefs=cs['coefs']
件数=cs[“件数”]
如果x=断裂[碎片]:
ind=件-1
差异=中断[ind+1]-中断[ind]
其他:
ind=0
当x>中断[ind+1]时:
ind+=1
差异=x-断裂[ind]
y=coefs[ind][3]+coefs[ind][2]*diff+coefs[ind][1]*diff*diff+coefs[ind][0]*diff*diff*diff*diff
返回y
vSubspline=np.矢量化(立方样条)
breaks=5*np.sort(np.random.randn(7))
coefs=np.random.randn(6,4)
件数=6
cs=dict()
cs[“件”]=件
cs['breaks']=中断
cs['coefs']=coefs
arr=np.random.randint(10,大小=(500500))
开始=时间。时钟()
a=vcubspline2(cs,arr)
打印一个形状
stop=time.clock()
打印停止-启动
我想知道这是否是计算输出的最快方法?如何改进这一点?如评论中所建议的那样,使用会使代码更高效、更简洁。该函数直接与数组x一起工作,创建条件数组(涉及x的不等式)和相应的函数数组,然后逐段将所有函数传递给
def cubicSpline(cs, x):
breaks = cs['breaks']
coefs = cs['coefs']
x = np.clip(x, breaks[0], breaks[-1]) # clip to the interval in which spline is defined
conditions = [x <= b for b in breaks]
functions = [coefs[0][3]] + [lambda x, c=c, b=b: c[3] + c[2]*(x-b) + c[1]*(x-b)**2 + c[0]*(x-b)**3 for c, b in zip(coefs, breaks)]
y = np.piecewise(x, conditions, functions)
return y
breaks = 5*np.sort(np.random.randn(7))
coefs = np.random.randn(6,4)
cs = {'breaks': breaks, 'coefs': coefs}
arr = np.random.randint(10, size=(500,500))
a = cubicSpline(cs, arr)
def行(cs,x):
breaks=cs['breaks']
coefs=cs['coefs']
x=np.剪裁(x,打断[0],打断[-1])#剪裁到定义样条线的间隔
条件=[x您是否有数据样本,以及该数据的样本(预期)输出?@GregJennings:添加的样本数据可能numpy。分段会更快。