7

scipy で griddata 関数を使用して、3 次元および 4 次元のデータを補間しています。チャンピオンのように機能しますが、必要なポイントの一部が入力データの範囲外であるため、多数の NaN が返される点が異なります。とにかく、Nd データは「線形」モードの補間でのみ機能するため、NaN を返すだけでなく、griddata に外挿を実行させるのは簡単です。誰かがこれを実行したか、回避策を見つけましたか? 明確にするために: 非構造化データがあるため、通常のグリッドを必要とする機能を使用できません。ありがとう!アレックス

4

2 に答える 2

1

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)
  • 必要な数の変数/ディメンションを使用できます。最初の引数 ( xy) は、ノードの座標として扱われます。引数の前の最後の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_dataplot_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()
于 2020-12-04T21:31:14.973 に答える
0

これが機能するかどうかはよくわかりませんが、まだ利用できませんが、numpy の開発バージョンには「パッド」配列関数があります...

https://github.com/numpy/numpy/blob/master/numpy/lib/arraypad.py

オプションの 1 つは 'linear_ramp' です。これは、エッジ値から開始して外挿 (パディング) し、指定された終了値まで直線的に増減します。

これは純粋なpython関数なので、パスにコピーしてインポートするだけです(ただし、私はテストしていません)

于 2012-07-07T05:51:17.893 に答える