[解決済み] scipy.interpolateが入力範囲を超えて外挿された結果を与えるようにするには?
2022-02-18 08:43:17
質問
数学者の同僚が開発した手動の補間器を使ったプログラムを、scipyが提供する補間器を使うように移植しようとしています。scipy のインターポレータを使用するか、ラップして、古いインターポレータにできるだけ近い動作をさせたいと考えています。
この2つの関数の重要な違いは、オリジナルのインターポレーターでは - 入力値が入力範囲より上または下にある場合、オリジナルのインターポレーターは結果を外挿するということです。これをscipyのインターポレータで試すと
ValueError
. このプログラムを例として考えてみましょう。
import numpy as np
from scipy import interpolate
x = np.arange(0,10)
y = np.exp(-x/3.0)
f = interpolate.interp1d(x, y)
print f(9)
print f(11) # Causes ValueError, because it's greater than max(x)
クラッシュする代わりに、最後の線が単に線形外挿を行い、最初と最後の2点で定義された勾配を無限大まで継続するようにする賢明な方法はないでしょうか。
実際のソフトウェアでは、exp関数は使っていないことに注意してください。
どのように解決するのですか?
1. 定数外挿
を使用することができます。
interp
関数は、左右の値を範囲外の定数として外挿します。
>>> from scipy import interp, arange, exp
>>> x = arange(0,10)
>>> y = exp(-x/3.0)
>>> interp([9,10], x, y)
array([ 0.04978707, 0.04978707])
2. 線形(または他のカスタム)外挿
線形補外を行う補間関数のラッパーを書くことができます。例えば
from scipy.interpolate import interp1d
from scipy import arange, array, exp
def extrap1d(interpolator):
xs = interpolator.x
ys = interpolator.y
def pointwise(x):
if x < xs[0]:
return ys[0]+(x-xs[0])*(ys[1]-ys[0])/(xs[1]-xs[0])
elif x > xs[-1]:
return ys[-1]+(x-xs[-1])*(ys[-1]-ys[-2])/(xs[-1]-xs[-2])
else:
return interpolator(x)
def ufunclike(xs):
return array(list(map(pointwise, array(xs))))
return ufunclike
extrap1d
は、補間関数を受け取り、外挿もできる関数を返します。そして、このように使うことができる。
x = arange(0,10)
y = exp(-x/3.0)
f_i = interp1d(x, y)
f_x = extrap1d(f_i)
print f_x([9,10])
出力します。
[ 0.04978707 0.03009069]
関連
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] 文字列が空かどうかを確認する方法は?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] ローカルディレクトリからrequirements.txtファイルに従ってpipを使用してパッケージをインストールするにはどうすればよいですか?
-
[解決済み] 文字のASCII値を取得する方法
-
[解決済み] 現在のファイルのディレクトリのフルパスを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptで整数の除算を行い、余りを別途取得する方法は?
-
[解決済み] クラスをJSONシリアライザブルにする方法
-
[解決済み] 10進数のrange()ステップ値を使用するには?
-
[解決済み] ユーザーが有効な応答を返すまで入力を求める
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Python LeNetネットワークの説明とpytorchでの実装
-
Python Pillow Image.save jpg画像圧縮問題
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?