你(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