Python 给定段和系数的快速三次样条输出计算?

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

我有一个三次样条激活函数,有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 >= 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。分段
会更快。