首頁 > 軟體

python實現線性插值的範例

2022-12-07 14:00:42

線性插值

插值:是根據已知的資料序列(可以理解為你座標中一系列離散的點),找到其中的規律,然後根據找到的這個規律,來對其中尚未有資料記錄的點進行數值估計。
線性插值:是針對一維資料的插值方法。它根據一維資料序列中需要插值的點的左右臨近兩個資料來進行數值估計。當然了它不是求這兩個點資料大小的平均值(在中心點的時候就等於平均值)。而是根據到這兩個點的距離來分配比重的。

python實現線性插值

numpy.interp

numpy.interp(x, xp, fp, left=None, right=None, period=None)

引數:

  • x:類似陣列,要插值點的橫座標
  • xp:一維浮點數序列,如果未指定引數週期,則資料點的x座標必須增加 . 否則,在用歸一化週期邊界之後對xp進行內部排序,xp = xp % period。
  • fp:一維浮點數或複數序列,資料點的y座標,與xp的長度相同。
  • left:可選擇引數。x <xp [0]的返回值,預設值為fp [0]。
  • right:可選擇引數。x> xp [-1]的返回值,預設值為fp [-1]。
  • period:設定橫座標的週期,該選項開啟時,則忽略left和right。

範例:

import numpy as np 
import matplotlib.pyplot as plt

xp = [1, 2, 3]
fp = [3, 2, 0]
y = np.interp(2.5, xp, fp)
#1.0

y = np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
#array([3.  , 3.  , 2.5 , 0.56, 0.  ])

UNDEF = -99.0
y = np.interp(3.14, xp, fp, right=UNDEF)
#-99.0

#sine 函數插值
x = np.linspace(0, 2*np.pi, 10)
y = np.sin(x)
xvals = np.linspace(0, 2*np.pi, 50)
yinterp = np.interp(xvals, x, y)

plt.plot(x, y, 'o')
plt.plot(xvals, yinterp, '-x')
plt.show()

#週期 x 座標的插值
x = [-180, -170, -185, 185, -10, -5, 0, 365]
xp = [190, -190, 350, -350]
fp = [5, 10, 3, 4]
y = np.interp(x, xp, fp, period=360)
#array([7.5 , 5.  , 8.75, 6.25, 3.  , 3.25, 3.5 , 3.75])

#複數插值Complex interpolation:
x = [1.5, 4.0]
xp = [2,3,5]
fp = [1.0j, 0, 2+3j]
y = np.interp(x, xp, fp)
#array([0.+1.j , 1.+1.5j])

範例:已知y座標,求x點。

import numpy as np

y = np.array([0, 38.39, 71.41, 99.66, 123.67, 143.88, 160.61, 174.03, 184.16, 190.8, 193.52])
x = np.array([0, 0.37, 0.74, 1.11, 1.48, 1.85, 2.22, 2.59, 2.96, 3.33, 3.7])
plt.plot(x, y, '-')

y_val = 30
root = np.interp(y_val, y, x)
print(root)

scipy.interpolate.interp1d

scipy.interpolate.interp1d(x, y, kind='linear', axis=- 1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)

引數:

  • x:數值陣列。一般是升序排列的x資料點。
  • y:數值陣列。與x資料點對應的y座標,插值維的長度必須與x長度相同。
  • kind:字串或整數,給出插值的樣條曲線的階數,線性插值用’linear’。‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, or ‘next’. ‘zero’, ‘slinear’, ‘quadratic’ ,‘cubic’。
  • axis:int
  • copy:bool
  • bounds_error:布林值,越界是否報錯,除非fill_value=‘extrapolate’,否則預設越界時報錯。
  • fill_value:陣列或’extrapolate’,指定不在x範圍內時的填充值或填充方法. 當為’extrapolate’時,返回的函數會對落在x範圍外的值進行外插。
  • assume_sorted:bool

範例:

x = data['時間']
y = data['濃度']
# 構建完整的時間序列 = [1,23,...23]
xnew = np.linspace(1,23,num=23)

# 線性插值
f1 = interp1d(x,y,kind='linear')
ynew1 = f1(xnew)
plt.scatter(x,y,zorder=3)
plt.plot(xnew,ynew1,marker='s',ls='--',c='C1')
plt.legend(['data','線性插值'])
plt.xticks(range(0,24,1))
plt.grid(ls='--',alpha=0.5)
plt.xlabel('A')
plt.ylabel('B')
plt.tight_layout()
plt.show()

範例:

from scipy.interpolate import interp1d

x = [1, 2, 3]
y = [3, 2, 0]
f = interp1d(x,y,fill_value=(3,0),bounds_error=False) # 線性內插
out = f([0, 1, 1.5, 2.72, 3.14])
print(out)
#array([3. , 3. , 2.5 , 0.56, 0. ])

fe = interp1d(x,y, fill_value='extrapolate') # 線性內插+外插
out = fe([0, 1, 1.5, 2.72, 3.14])
print(out)
#array([ 4. , 3. , 2.5 , 0.56, -0.28])

到此這篇關於python實現線性插值的文章就介紹到這了,更多相關python線性插值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com