2014-01-08 34 views
5

「最近」的方法,我希望找到Python的等價以下Matlab的聲明:Extraploation可以用Python

vq interp1(x,y, xq,'nearest','extrap') 

看起來好像interp(xq, x, y)完全適用於線性內插/外推。

我也看了

F = scipy.interpolate.interp1d(x, y, kind='nearest') 

這完全適用於最接近的方法,但不會進行外。

還有什麼我忽略了嗎?謝謝。

回答

5

對於將使用最近的插值進行外插的線性插值,請使用numpy.interp。它默認這樣做。

例如:

yi = np.interp(xi, x, y) 

否則,如果你只想處處最近插值,象你所說的,你可以做到這一點在短期內,但低效的方式:(可以讓這個一行代碼,如果你想)

def nearest_interp(xi, x, y): 
    idx = np.abs(x - xi[:,None]) 
    return y[idx.argmin(axis=1)] 

或者以更有效的方式使用searchsorted

def fast_nearest_interp(xi, x, y): 
    """Assumes that x is monotonically increasing!!.""" 
    # Shift x points to centers 
    spacing = np.diff(x)/2 
    x = x + np.hstack([spacing, spacing[-1]]) 
    # Append the last point in y twice for ease of use 
    y = np.hstack([y, y[-1]]) 
    return y[np.searchsorted(x, xi)] 

爲了說明和上面的最近的內插的例子numpy.interp之間的差:

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    x = np.array([0.1, 0.3, 1.9]) 
    y = np.array([4, -9, 1]) 
    xi = np.linspace(-1, 3, 200) 

    fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True) 
    for ax in axes: 
     ax.margins(0.05) 
     ax.plot(x, y, 'ro') 

    axes[0].plot(xi, np.interp(xi, x, y), color='blue') 
    axes[1].plot(xi, nearest_interp(xi, x, y), color='green') 

    kwargs = dict(x=0.95, y=0.9, ha='right', va='top') 
    axes[0].set_title("Numpy's $interp$ function", **kwargs) 
    axes[1].set_title('Nearest Interpolation', **kwargs) 

    plt.show() 

def nearest_interp(xi, x, y): 
    idx = np.abs(x - xi[:,None]) 
    return y[idx.argmin(axis=1)] 

main() 

enter image description here

+0

傑出,感謝喬。 – user3174418