def idw(data):
valid = np.argwhere(~np.isnan(data))
tree = spatial.cKDTree(valid)
nans = np.argwhere(np.isnan(data))
for row in nans:
d, idx = tree.query(row, k=12)
d = np.power(d, -2)
v = data[valid[idx, 0], valid[idx, 1]]
data[row[0], row[1]] = np.inner(v, d)/np.sum(d)
return data