2017-06-19 29 views
1

我有相同尺寸的多个阵列,或者更确切地说,一个矩阵说SciPy的并行插值

data.shape 
# (n, m) 

我想插值m-axis和离开n-axis。理想情况下,我会得到一个函数,我可以通过长度为nx-array来调用。

interpolated(x) 
x.shape 
# (n,) 

我试图

from scipy import interpolate 
interpolated = interpolate.interp1d(x=x_points, y=data) 
interpolated(x).shape 
# (n, n) 

但这种评估在给定的点每个数组。有没有更好的办法做到这一点比丑陋的循环一样

interpolated = array(interpolate.interp1d(x=x_points, y=array_) for 
        array_ in data) 
array(func_(xi) for func_, xi in zip(interpolated, x)) 

回答

1

(n,m)形数据,如你所说,是n数据集,各长m的集合。您正试图通过这个长度为n的长度为x的阵列,并期望获得长度为n的长度结果。也就是说,你正在查询n独立数据集n无关的点。

这让我相信你需要使用n独立插补器。试图摆脱一次插入例程的调用并没有真正的好处。据我所知,插值例程假定插值的目标是单个对象。多元函数或具有数组形状值的函数;在任何一种情况下,您都可以一次查询一个函数(可选更高维)。例如,多线性插值可以在输入的各行之间起作用,所以还有(就我所知),没有办法“沿轴线线性插入”。在你的情况下,你的data的行之间绝对没有关系,并且查询点之间没有关系,所以它的语义动机也是为你的问题使用n独立插补器。


,为了方便,你可以推所有这些插值功能集成到一个单一功能的易用性:

interpolated = [interpolate.interp1d(x=x_points, y=array_) for 
        array_ in data] 

def common_interpolator(x): 
    '''interpolate n separate datasets at n separate input points''' 
    return array([fun(xx) for fun,xx in zip(interpolated,x)]) 

这将允许你使用一个调用common_interpolator与输入array_like长度为n

但既然你在评论中提到它,你其实可以利用np.vectorize如果你想多套,如果查询点添加到该功能。这里有三个假人琐碎一个功能完整的例子:

import numpy as np 

# three scalar (well, or vectorized) functions: 
funs = [lambda x,i=i: x+i for i in range(3)] 

# define a wrapper for calling them together 
def allfuns(xs): 
    '''bundled call to functions: n-length input to n-length output''' 
    return np.array([fun(x) for fun,x in zip(funs,xs)]) 

# define a vectorized version of the wrapper, (...,n) to (...,n)-shape 
allfuns_vector = np.vectorize(allfuns,signature='(n)->(n)') 

# print some examples 
x = np.arange(3) 
print([fun(xx) for fun,xx in zip(funs,x)]) 
# [0, 2, 4] 
print(allfuns(x)) 
# [0 2 4] 
print(allfuns_vector(x)) 
# [0 2 4] 
print(allfuns_vector([x,x+10])) 
#[[ 0 2 4] 
# [10 12 14]] 

正如你所看到的,所有上述工作,为一维输入数组的方式相同。但是我们可以通过一个(k,n)形阵列以向量化版本,它会执行内插行方向,即每个[:,n]切片将被馈送到原始内插器束。据我所知np.vectorize本质上是一个for循环的包装,但至少它使调用你的函数更方便。

+1

我同意,可能必须执行独立的插值。不过,为了方便起见,我仍然想将结果函数“捆绑”成一个函数。这仅仅是为了可读性和避免错误。但我不认为像'np.vectorize'这样的东西可以用于多种功能。 – DerWeh

+0

@DerWeh我添加了我的两个关于捆绑你的函数,特别是使用np.vectorize。请让我知道它如何适用于更复杂的示例。 –

+1

迄今为止似乎不错。我只是有一个方便的问题。如果'len(xs) DerWeh