Вы говорите «заполнен наном», но на самом деле он не заполнен. Используя ваш код, но добавив
np.random.seed(7)
в начале, так что мы работаем с одним и тем же набором данных, я нахожу
>>> np.isnan(grid_z1).sum()
744
>>> np.isnan(grid_z2).sum()
744
И эти NaN встречаются на внешней полосе:
>>> np.isnan(grid_z1[5:-5,5:-5]).sum()
0
, что делает вероятным, в чем проблема. Точки, которые дают NaN, находятся за пределами указанных точек, поэтому он не знает, что с ними делать. Для особого случая «ближайшей» интерполяции вы все равно можете найти что-то, что рядом, так что вы не получите никаких NaN.
Так что, когда вы говорите, что точки, на которые нужно интерполировать, не лежат вне входных точек, я позволю себе отличаться:
# brute force, because I'm too lazy
from collections import Counter
d = Counter()
for x, y, val in zip(grid_x.flat, grid_y.flat, grid_z1.flat):
pg = (points >= [x, y])
boxed = len(set(tuple(p) for p in pg)) == 4
d[np.isnan(val), boxed] += 1
производит
>>> d
Counter({(False, True): 19189, (True, False): 744, (False, False): 67})
И нет (Правда, Правда) случаев. Таким образом, каждому NaN не хватает ограничительной рамки в точках. В некоторых случаях (Ложь, Ложь) значение не имеет ограничивающего прямоугольника, но не приводит к появлению NaN, что немного удивительно, но если они предположили, что все содержится, это, вероятно, будет зависеть от скучного детали реализации, что происходит, если они не. Короткая версия: я думаю, что все здесь, вероятно, работает правильно, в смысле, как и ожидалось.