Scipy interp1d интерполированный маскированный массив - PullRequest
3 голосов
/ 19 марта 2020

У меня есть замаскированный массив (пример игрушки) - [1 2 3 4 -- 6]

points = [1, 2, 3, 4, 0, 6]
mask = [0, 0, 0, 0, 1, 0]
points = ma.array(points, mask=mask)

И я хотел бы интерполировать его из 6 измерений в любое число, например, 6. Мои критерии интерполяции таковы, что он будет игнорировать маскированные значения и пропустить этот индекс.

Нежелательное поведение, например, с lin = np.linspace(0, 1, 6):

f = interp1d(lin, points, axis=0, kind='cubic')
f(lin) # [1  2 3 4 -8.8817842e-16 6]

Вместо этого я ожидаю, что оно будет вести себя как:

compressed_lin = [0, 0.2, 0.4, 0.6, 1]
compressed_points = np.array([1,2,3,4,6])
f = interp1d(compressed_lin, compressed_points, axis=0, kind='cubic')
f(lin) # [1 2 3 4 5 6]

Фактические данные:

Мои данные имеют форму [100, 100, 2], поэтому их не так просто, как скрыть маскированные значения из linspace размера 100.

Примечание к замаскированному массиву:

Я уже знаю, что есть способ выполнить 2-мерную интерполяцию для замаскированного массива (https://modelhelptokyo.wordpress.com/2017/10/25/how-to-interpolate-missing-values-2d-python/, Скриптная интерполяция с замаскированными данными? , Scipy interp2d интерполирует замаскированные значения заливки )

Если был способ интерполировать все значения в замаскированном массиве для заполнения, а не постоянное заполнение, которое решит проблема, как тогда я буду иметь дело с заполненным numpy массивом.

причина Я не могу использовать compressed, это может изменить порядок индексов и размер массива, например:

points = np.array([1, 2, 3, 4, 5, 6])

points = ma.stack([
    ma.array(points, mask=[0, 0, 0, 0, 1, 0]),
    ma.array(points, mask=[0, 0, 1, 0, 0, 0]),
])

print(points)
# [[1 2 3 4 -- 6]
# [1 2 -- 4 5 6]]

print(np.reshape(points.compressed(), (2, 5)))
# [[1 2 3 4 6]
# [1 2 4 5 6]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...