Вы должны принять решение как вы хотите заполнить нули. Например, вы можете просто использовать среднее значение в массиве:
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.