2

次の抜粋は、numpy ルックアップ関数を構築しようとしている 500 行のテーブルです。私の問題は、値が非線形であることです。

ユーザーはdensityvolume、および を入力しcontentます。したがって、関数は次のようになります。

def capacity_lookup(density, volume, content:

たとえば、一般的なユーザー エントリは次のようになりますcapacity_lookup (47, 775, 41.3)。この関数は、値 45 と 50、密度 700 と 800、コンテンツ 40 と 45 の間を補間する必要があります。

表の抜粋は次のとおりです。

Volume  Density        Content 
                <30 35  40  45  50>=
45.0    <=100   0.1 1.8 0.9 2.0 0.3
45.0    200     1.5 1.6 1.4 2.4 3.0
45.0    400     0.4 2.1 0.9 1.8 2.5
45.0    600     1.3 0.8 0.2 1.7 1.9
45.0    800     0.6 0.9 0.8 0.4 0.2
45.0    1000    0.3 0.8 0.5 0.3 1.0
45.0    1200    0.6 0.0 0.6 0.2 0.2
45.0    1400    0.6 0.4 0.3 0.7 0.1
45.0    >=1600  0.3 0.0 0.6 0.1 0.3
50.0    <=100   0.1 0.0 0.5 0.9 0.2
50.0    200     1.3 0.4 0.8 0.2 2.7
50.0    400     0.4 0.1 0.7 1.3 1.7
50.0    600     0.8 0.7 0.1 1.2 1.6
50.0    800     0.5 0.3 0.4 0.2 0.0
50.0    1000    0.2 0.4 0.4 0.2 0.3
50.0    1200    0.4 0.0 0.0 0.2 0.0
50.0    1400    0.0 0.3 0.1 0.5 0.1
50.0    >=1600  0.1 0.0 0.0 0.0 0.2
55.0    <=100   0.0 0.0 0.4 0.6 0.1
55.0    200     0.8 0.3 0.7 0.1 1.2
55.0    400     0.3 0.1 0.3 1.1 0.7
55.0    600     0.4 0.3 0.0 0.6 0.1
55.0    800     0.0 0.0 0.0 0.2 0.0
55.0    1000    0.2 0.1 0.2 0.1 0.3
55.0    1200    0.1 0.0 0.0 0.1 0.0
55.0    1400    0.0 0.2 0.0 0.2 0.1
55.0    >=1600  0.0 0.0 0.0 0.0 0.1

質問

500 行のテーブルを保存して、非線形データを補間し、ユーザー入力に基づいて正しい値を取得するにはどうすればよいですか?

明確化

  1. ユーザーが次のベクトル (775、47、41.3) を入力した場合、プログラムは次の 4 つのベクトルの間で補間された値を返す必要が45.0, 600, 0.2, 1.7あり45.0, 800, 0.8, 0.4ます50.0, 600, 0.1, 1.250.0, 800, 0.4, 0.2
  2. データが設計の numpy 配列として DB からプルされると仮定します
4

2 に答える 2

2

Saulloの答えを補完するために、トリリニア補間を行う方法を次に示します。基本的に立方体を正方形に補間し、次に正方形をセグメントに補間し、セグメントをポイントに補間します。補間の順序によって最終結果が変わることはありません。Saullo の番号付けスキームはすでに正しいものです。ベース頂点は番号 0 で、最後の次元を増やすと頂点番号に 1 が追加され、最後から 2 番目の次元が 2 が追加され、最初の次元が 4 が追加されます。したがって、彼の頂点を返す関数から、次のことができます。

coords = np.array([47, 775, 41.3])
ndim = len(coords)
# You would get this with a call to:
# vertices = get_8_points(filename, *coords)
vertices = np.array([[  4.50e+01,   6.00e+02,   4.00e+01,   2.00e-01],
                     [  4.50e+01,   6.00e+02,   4.50e+01,   1.70e+00],
                     [  4.50e+01,   8.00e+02,   4.00e+01,   8.00e-01],
                     [  4.50e+01,   8.00e+02,   4.50e+01,   4.00e-01],
                     [  5.00e+01,   6.00e+02,   4.00e+01,   1.00e-01],
                     [  5.00e+01,   6.00e+02,   4.50e+01,   1.20e+00],
                     [  5.00e+01,   8.00e+02,   4.00e+01,   4.00e-01],
                     [  5.00e+01,   8.00e+02,   4.50e+01,   2.00e-01]])

for dim in xrange(ndim):
   vtx_delta = 2**(ndim - dim - 1)
    for vtx in xrange(vtx_delta):
        vertices[vtx, -1] += ((vertices[vtx + vtx_delta, -1] -
                               vertices[vtx, -1]) *
                              (coords[dim] -
                               vertices[vtx, dim]) /
                              (vertices[vtx + vtx_delta, dim] -
                               vertices[vtx, dim]))

print vertices[0, -1] # prints 0.55075

この関数は、 に格納された最終値につながる中間補間のために vertices 配列を再利用します。後で必要になる場合vertices[0, -1]は、配列のコピーを作成する必要があります。vertices

于 2013-08-19T17:31:30.397 に答える