Если только точки считаются ближайшими, если они следуют за осью со значениями другой оси, например, статическими. что (1,1,0) не будет квалифицироваться как ближайшее к (0,0,0), но (4,0,0) вы могли бы:
import numpy as np
#The .T is ofcourse not neccesary here but then you have to fix it below as well.
points = np.asarray( [(4, 3, 0), (4, 4, 0), (5, 3, 0), (3, 3, 0), (4, 3, 1)]).T
#You have still to check thiss for all points just showing for pt 0
on_same_xy = (points[:-1,:].T == points[:-1,0]).all(axis=1)
z_distance = (points[2,on_same_xy] - points[2,0])
z_distance_up = z_distance[np.where(z_distance > 0)]
if z_distance_up.size == 0:
up = None
else:
up = z_distance_up.min()
z_distance_down = z_distance[np.where(z_distance < 0)]
if z_distance_down.size == 0:
down = None
else:
down = z_distance_down.max()
print "Z-up-neighbour %s, Z-down-neighbour %s" % (str(up), str(down))
Поскольку у вас есть два первых значения координат только для точек [-1,0], то положение точки вверх и вниз, а также расстояние можно получить сверху и снизу.
Я понимаю, что код немного запутался, но как только большой набор данных оказывается внутри nunpy, он действительно должен работать быстрее. Кроме того, опять же, вопрос в том, о чем просит ваш вопрос.