你(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循环的包装,但至少它使调用你的函数更方便。
我同意,可能必须执行独立的插值。不过,为了方便起见,我仍然想将结果函数“捆绑”成一个函数。这仅仅是为了可读性和避免错误。但我不认为像'np.vectorize'这样的东西可以用于多种功能。 – DerWeh
@DerWeh我添加了我的两个关于捆绑你的函数,特别是使用np.vectorize。请让我知道它如何适用于更复杂的示例。 –
迄今为止似乎不错。我只是有一个方便的问题。如果'len(xs)
DerWeh