Заполните пропущенные значения в 2-мерной матрице, используя интерполяцию в numpy / scipy - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно заполнить пропущенные значения (заданные как 0) в 2d матрице. Как бы я совершил это в numpy / scipy? Я нашел функцию scipy.interpolate.interp2d , но не могу понять, как заставить ее заполнять нули только без изменения ненулевых записей.

Вот пример этой функции, используемой для сглаживания изображения https://scipython.com/book/chapter-8-scipy/examples/scipyinterpolateinterp2d/

, но это не то, что я ищу. Я просто хочу заполнить нулевые значения.

Например, матрица:

import numpy as np
mat = np.array([[1,2,0,0,4], [1,0,0,0,8], [0,4,2,2,0], [0,0,0,0,8], [1,0,0,0,1]])

mat
array([[1, 2, 0, 0, 4],
       [1, 0, 0, 0, 8],
       [0, 4, 2, 2, 0],
       [0, 0, 0, 0, 8],
       [1, 0, 0, 0, 1]])

В этой матрице все нули должны быть заменены интерполированными значениями, в то время как исходные значения должны остаться прежними. Что я могу использовать для этой задачи?

1 Ответ

1 голос
/ 02 мая 2020

Вы должны принять решение как вы хотите заполнить нули. Например, вы можете просто использовать среднее значение в массиве:

mat[mat == 0] = np.average(mat)
mat
# array([[1, 2, 1, 1, 4],
#        [1, 1, 1, 1, 8],
#        [1, 4, 2, 2, 1],
#        [1, 1, 1, 1, 8],
#        [1, 1, 1, 1, 1]])

или вы можете использовать значения из какой-либо функции, которые соответствуют ненулевым значениям --- scipy.interpolate.interp2d использует "сплайн" (думаю, полиномиальный):

from scipy.interpolate import interp2d

ix = np.where(mat != 0)
f = interp2d(ix[0], ix[1], mat[ix].flatten(), kind='linear')
mat2 = mat.copy()
mat2[mat==0] = f(range(5), range(5)).T[mat==0]
mat2
# array([[ 1,  2,  3,  4,  4],
#        [ 1,  1,  1,  1,  8],
#        [ 4,  4,  2,  2, 11],
#        [ 4,  3,  2,  1,  8],
#        [ 1,  0,  0,  0,  1]])

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

Вы также можете взглянуть на другие вменения подходов , как и ближайшие соседи и др. c.

...