離散データから連続値を得よう!
離散的なデータ$(x_i, y_i)$から$y=f(x)$となるような$f$を作成。
色々な補間方法を一つのクラスから生成できるようにしています。
from scipy import interpolate
class Interpolate():
def __init__(self, name, xrefs, yrefs):
self.methods = {"1st": lambda x, y: interpolate.interp1d(x, y, kind=1),
"2nd": lambda x, y: interpolate.interp1d(x, y, kind=2),
"3rd": lambda x, y: interpolate.interp1d(x, y, kind=3),
"Akima": interpolate.Akima1DInterpolator,
"PCHIP": interpolate.PchipInterpolator,
"nearest": lambda x, y: interpolate.interp1d(x, y, kind="nearest"),
"nearest_up": lambda x, y: interpolate.interp1d(x, y, kind="nearest-up"),
"previous": lambda x, y: interpolate.interp1d(x, y, kind="previous"),
"next": lambda x, y: interpolate.interp1d(x, y, kind="next"),
"Lagrange": interpolate.lagrange,
"Krogh": interpolate.KroghInterpolator,
"Barycentric": interpolate.BarycentricInterpolator
}
method = self.methods[name]
self.fittedcurve = method(xrefs, yrefs)
def __call__(self, x):
return self.fittedcurve(x)
使い方
- 既知データ
xrefs, yrefs
と補間方法を指定してInterpolate
クラスのインスタンスを作成 - インスタンスに未知の
x
を代入すると補間された結果が返ってくる
下記コードでは1次のスプライン補間(線形補間)を行っています。
# 既知データ
xrefs = [0.0, 5.0, 10.0]
yrefs = [0.0, 5.0, 10.0]
# 推定したいx
x = [0.0, 2.5, 5.0]
# Interpolateクラスのインスタンス、今回は線形補間
y = Interpolate("1st", xrefs, yrefs)
print(x)
print(y(x))
# [0.0, 2.5, 5.0]
# [0. 2.5 5. ]
nearest
とnearest_up
の違いは2点間のちょうど中点が指定された際、下側をとるか上側を取るかの違い。