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でそれを実装する方法は? そのためのnumpy関数はありますか?