2017-09-19 9 views
0

線形補間はかなり単純です:2つの数値間の線形補間をより高次のテンソルに一般化する方法は? 2つの値の間の

def lerp(v, d): 
    return v[0] * (1 - d) + v[1] * d 

print lerp(np.array([3, 5]), 0.75) 
> 4.5 

は、形状の任意のテンソル(2、2、...)にそれを一般化してみましょう、すなわち:それは作品

def lerp(v, d): 
    assert len(v.shape) >= 1 and d.shape == (len(v.shape),) 
    if len(v.shape) == 1: 
     assert v.shape[0] == 2 
     dd = np.array([1 - d[0], d[0]], dtype=v.dtype) 
     return sum(v * dd) 
    else: 
     v = [lerp(submatrix, d[1:]) for submatrix in v] 
     return lerp(np.array(v), d[:1]) 

assert lerp(np.array([3.0, 4.0]), np.array([0.75])) == 3.75 
assert lerp(
    np.array(xrange(8), dtype='float64').reshape((2,2,2)), 
    np.array([0.25, 0.5, 0.75]) 
) == 2.75 

は、すべての値であるときスカラーではありませんが、個々の値がテンソルであり、形状がアサーションでない場合はそうではありません。例えば:それはテンソル値でも動作するように

assert all(lerp(
    np.array([[1.0, 2.0], [3.0, 4.0]]), 
    np.array([0.75]) 
) == np.array([ 2.5, 3.5])) 

はどのように配列のインデックスなどで遊んで、Pythonの再帰なしで、純粋なnumpyのとそれを実装するには?それには何のための関数がありますか?

答えて

0

scipy RegularGridInterpolatorは、線形補間アルゴリズムまたは最近隣アルゴリズムを使用して、n次元のグリッドデータセットからポイントを補間できます。このリンクの例は役立つはずです。

関連する問題