Как обобщить линейную интерполяцию между двумя числами в тензоры большей размерности?

Линейная интерполяция между двумя значениями довольно проста:

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]))

Как реализовать это с чисто numpy, без рекурсии Python, играя с индексами массива и т. Д., Чтобы он работал также с тензорными значениями? Есть ли какая-нибудь функция для этого?

0 ответов

Другие вопросы по тегам