У Сципи есть модуль интерполяции, который может сделать это. Исходя из вышеизложенного (при публикации вопроса), этот код можно запустить в следующей ячейке:
from scipy import interpolate
# integer arrays for indexing
x_indx, y_indx = np.meshgrid(np.arange(0, zs.shape[1]),
np.arange(0, zs.shape[0]))
# mask all invalid values
zs_masked = np.ma.masked_invalid(zs)
# retrieve the valid, non-Nan, defined values
valid_xs = x_indx[~zs_masked.mask]
valid_ys = y_indx[~zs_masked.mask]
valid_zs = zs_masked[~zs_masked.mask]
# generate interpolated array of z-values
zs_interp = interpolate.griddata((valid_xs, valid_ys), valid_zs.ravel(),
(x_indx, y_indx), method='cubic')
# finally, plot the data
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X=xs, Y=ys, Z=zs_interp)
Возвращается следующий график:
Обратите внимание, что этот код оптимизирован для удобочитаемости и понятности, а не эффективности памяти. Повторная оптимизация этого кода для повышения эффективности памяти является тривиальной задачей, которая остается на усмотрение читателя