scipy で griddata 関数を使用して、3 次元および 4 次元のデータを補間しています。チャンピオンのように機能しますが、必要なポイントの一部が入力データの範囲外であるため、多数の NaN が返される点が異なります。とにかく、Nd データは「線形」モードの補間でのみ機能するため、NaN を返すだけでなく、griddata に外挿を実行させるのは簡単です。誰かがこれを実行したか、回避策を見つけましたか? 明確にするために: 非構造化データがあるため、通常のグリッドを必要とする機能を使用できません。ありがとう!アレックス
2 に答える
3、4、または実際には任意の次元でデータを補間および推定する 1 つの可能性は、scipy.interpolate.Rbfを使用することです。
get_data()
関数と関数はplot_3d()
便宜上末尾に付けられています。
サンプルデータ
サンプル データは次のようになります (4 番目の次元 w は色付きで表示されます)。データの間隔は不規則で、グリッド化されていません。
x, y, z, w = get_data(N=200)
plot_3d(x, y, z, w)
3D での内挿と外挿
まず、新しい x 座標と y 座標を設定しましょう。これをさらに興味深いものにするために、マイナス x およびマイナス y 方向に外挿してみましょう。これにより、関心のある新しい x および y 範囲が形成されます。
xs = np.linspace(-10, 20) # some extrapolation to negative numbers
ys = np.linspace(-10, 20) # some extrapolation to negative numbers
xnew, ynew = np.meshgrid(xs, ys)
xnew = xnew.flatten()
ynew = ynew.flatten()
scipy.interpolate.Rbfによる補間。今、
from scipy.interpolate import Rbf
rbf3 = Rbf(x, y, z, function="multiquadric", smooth=5)
znew = rbf3(xnew, ynew)
plot_3d(xnew, ynew, znew)
- 必要な数の変数/ディメンションを使用できます。最初の引数 (
x
、y
) は、ノードの座標として扱われます。引数の前の最後のfunction
引数は、補間される「値」です (現在:z
)。 function
引数を使用して、値を補間する方法を制御できます。これは結果に影響するので、データをいじってみてください。.- この
smooth
パラメーターを使用して、データのノイズを滑らかにすることができます。がゼロの場合smooth
、結果は補間されます。すべてのデータポイントを通過します。正の値の場合、データはより滑らかになります。これは結果に影響するので、データをいじってみてください。. - 以下は結果であり、外挿はもちろんひどく外れています。これは、外挿が可能であることを示すためのものです。
function
希望する結果を得るために、微調整が必要になる場合がありsmooth
ます。通常、データは「あまり」外挿されるべきではありません (この例のように)
4 次元の追加
4次元への内挿・外挿も可能です。方法は次のとおりです。
rbf4 = Rbf(x, y, z, w, function="thin_plate", smooth=5)
wnew = rbf4(xnew, ynew, znew)
plot_3d(xnew, ynew, znew, wnew)
- 4 番目の次元用に別の
Rbf
インスタンスを作成し、 (3D での補間) でznew
計算されたものを使用しました。rbf3
- このデータセットを使用すると視覚的にパフォーマンスが向上するように見えたので、
function
をに変更しました。"thin_plate"
- 結果は次のようになります。
付録:get_data
とplot_3d
テスト目的:
import numpy as np
def get_data():
np.random.seed(100)
N = 200
maxval = 20
x = np.random.random(N) * maxval
y = np.random.random(N) * maxval
z = x ** 2 + np.sqrt(y) * y - y ** 3 + np.random.random(N) + 18 * y ** 2 * 2
w = x ** 2 - np.log(y + (x * y) ** 2)
return x, y, z, w
def plot_3d(x, y, z, w=None, show=True):
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure(figsize=(10, 6))
ax = axes3d.Axes3D(fig)
ax.scatter3D(x, y, z, c=w if not w is None else "b")
plt.show()
これが機能するかどうかはよくわかりませんが、まだ利用できませんが、numpy の開発バージョンには「パッド」配列関数があります...
https://github.com/numpy/numpy/blob/master/numpy/lib/arraypad.py
オプションの 1 つは 'linear_ramp' です。これは、エッジ値から開始して外挿 (パディング) し、指定された終了値まで直線的に増減します。
これは純粋なpython関数なので、パスにコピーしてインポートするだけです(ただし、私はテストしていません)