Интерполировать неструктурированные данные X, Y, Z по наилучшей сетке на основе ближайшего соседнего расстояния для каждой точки

Этот вопрос был отредактирован после ответов для окончательного решения, которое я использовал

У меня есть неструктурированные 2D-наборы данных, поступающие из разных источников, например, например: Пример данных 1: 3D-измерение Примеры данных 2: Узлы 2D-сетки Набор данных тезисов – 3 numpy.ndarray (координаты X, Y и Z).

Моя конечная цель – интерполировать данные тезисов на сетку для преобразования в изображение / матрицу. Поэтому мне нужно найти «наилучшую сетку» для интерполяции данных тезисов. И для этого мне нужно найти лучшие шаги X и Y между пикселями этой сетки.

Определить шаг, основанный на евклидовом расстоянии между точками:

Используйте среднее значение евклидовых расстояний между каждой точкой и ближайшим соседом.

  • Используйте KDTree / cKDTree из scipy.spacial для построения дерева данных X, Y.
  • Используйте метод 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 : Большая скорость в моем случае, но может быть scipy.spatial.cKDTree для всех данных.
  • Используйте n_jobs=-1 с cKDTree.query для использования многопоточности.
  • Используйте p=1 с cKDTree.query для использования расстояния Манхэттена вместо евклидова расстояния ( p=2 ): быстрее, но может быть менее точным.
  • Запросите расстояние только для случайной подвыборки точек: Большая скорость с большими наборами данных, но может быть менее точной и менее повторяемой.

Интерполировать точки на сетке:

Интерполируйте точки набора данных на сетке с помощью вычисленного шага.

 # 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 

2 Solutions collect form web for “Интерполировать неструктурированные данные X, Y, Z по наилучшей сетке на основе ближайшего соседнего расстояния для каждой точки”

Я предлагаю вам пойти с KDTree.query .

Вы ищете расстояние, на котором вы можете увеличить расстояние до шкалы: я предлагаю вам взять только случайное подмножество ваших очков и использовать расстояние Манхэттена , KDTree.query очень медленный (и все же это * log (n) сложности).

Вот мой код:

 # CreateTree tree=scipy.spatial.KDTree(numpy.array(points)) # better give it a copy? # Create random subsample of points n_repr=1000 shuffled_points=numpy.array(points) numpy.random.shuffle(shuffled_points) shuffled_points=shuffled_points[:n_repr] # Query the tree (dists,points)=tree.query(shuffled_points,k=2,p=1) # Get _extimate_ of average distance: avg_dists=numpy.average(dists) print('average distance Manhattan with nearest neighbour is:',avg_dists) 

Я предлагаю вам использовать расстояние Манхэттена ( https://en.wikipedia.org/wiki/Taxicab_geometry ), потому что оно быстрее вычисляется, чем эвклидовое расстояние. А так как вам нужна только оценка среднего расстояния, этого должно быть достаточно.

Проблема, которую вы хотите решить, называется проблемой «всех ближайших соседей». См. Эту статью, например: http://link.springer.com/article/10.1007/BF02187718

Я считаю, что решения для этого – O (N log N), поэтому в том же порядке, что и KDTree.query, но на практике намного, намного быстрее, чем куча отдельных запросов. Извините, я не знаю о реализации python этого.

  • Numpy: Обобщенная задача на собственные значения
  • Что такое «скаляр» в numpy?
  • Удаление полностью изолированных ячеек из массива Python?
  • Каков хороший способ получить показатель сходства двух изображений, содержащих линейную диаграмму?
  • Numpy: Как избавиться от минимумов вдоль оси = 1, учитывая показатели - эффективным образом?
  • fsolve всегда возвращает оценку / оценку
  • разрезающая разреженная (scipy) матрица
  • Как вычислить логарифм 1 минус показатель данного небольшого числа в python
  • Python - лучший язык программирования в мире.