Этот вопрос был отредактированных после ответов на окончательное решение шоу я использовалInterpolate неструктурированных X, Y, данные Z по лучшей сетке на основе ближайших соседей расстояния для каждой точек
У меня есть неструктурированные 2D наборов данных, поступающих из различных источников, как, например,: Данные наборов данных 3 numpy.ndarray (координаты X, Y и значение Z).
Моя конечная цель - интерполировать данные тезисов на сетку для преобразования в изображение/матрицу. Итак, мне нужно найти «наилучшую сетку» для интерполяции данных тезисов. И для этого мне нужно найти лучшие шаги X и Y между пикселями этой сетки.
Наличного шаг на основе евклидова расстояния между точками:
Используйте средние евклидов расстояний между каждой точкой и ее ближайшим соседом.
- Использование
KDTree
/cKDTree
из scipy.spacial для построения дерева X, Y DATAS. - Используйте метод
query
сk=2
для получения расстояний (еслиk=1
, расстояния равны нулю, потому что запрос для каждой найденной точки).
# Generate KD Tree
xy = np.c_[x, y] # X,Y data converted for use with KDTree
tree = scipy.spacial.cKDTree(xy) # Create KDtree for X,Y coordinates.
# Calculate step
distances, points = tree.query(xy, k=2) # Query distances for X,Y points
distances = distances[:, 1:] # Remove k=1 zero distances
step = numpy.mean(distances) # Result
подстройка Производительность:
- Использование
scipy.spatial.cKDTree
и неscipy.spatial.KDTree
, потому что это действительно быстрее. - Использование
balanced_tree=False
сscipy.spatial.cKDTree
: Большая скорость в моем случае, но может быть неверной для всех данных. - Используйте
n_jobs=-1
сcKDTree.query
для использования многопоточности. - Использование
p=1
сcKDTree.query
для использования Манхэттенское расстояние вместо евклидова расстояния (p=2
): Быстрее, но может быть менее точным. - Запросить расстояние только для случайной подвыборки точек: Большая скорость с большими наборами данных, но может быть менее точной и менее повторяемой.
интерполировать точки на сетке:
Interpolate набор данных точек на сетке, используя просчитанный шаг.
# Generate grid
def interval(axe):
'''Return numpy.linspace Interval for specified axe'''
cent = axe.min() + axe.ptp()/2 # Interval center
nbs = np.ceil(axe.ptp()/step) # Number of step in interval
hwid = nbs * step/2 # Half interval width
return np.linspace(cent - hwid, cent + hwid, nbs) # linspace
xg, yg = np.meshgrid(interval(x), interval(y)) # Generate grid
# Interpolate X,Y,Z datas on grid
zg = scipy.interpolate.griddata((x, y), z, (xg, yg))
Набора NaN, если пиксель слишком далеко от точек инициалов:
Набора NaN в пиксели из сетки, которые слишком далеко (Расстояние> шаг) из точек от начального X, Y, Z данных. Используется предыдущий созданный KDTree.
# Calculate pixel to X,Y,Z data distances
dist, _ = tree.query(np.c_[xg.ravel(), yg.ravel()])
dist = dist.reshape(xg.shape)
# Set NaN value for too far pixels
zg[dist > step] = np.nan
В чем была проблема с KDTree от scipy? – M4rtini
Я пытался использовать его с методом 'query', но для каждой точки результат сам по себе. Другие методы, похоже, не полезны в моем случае. Это похоже на работу с двумя разными наборами координат. –
Используйте 'query' с k = 2. Вторая точка должна быть ближайшим соседом. – M4rtini