2017-06-19 32 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