Удаление точек, которые находятся на определенном расстоянии друг от друга в 2D массиве numpy

#python #python-3.x #numpy #numpy-ndarray

#python #python-3.x #numpy #numpy-ndarray

Вопрос:

У меня есть следующий 2D массив:

 MyData = array([x = [ 82, 210, 203, 234, 135,  92, 176, 146, 246,  35, 257, 227, 258,
    132,  31, 160, 269,  24, 248, 274, 281, 279,  71,  21, 188, 163,
    243],
   y = [ 15,  16,  18,  18,  19,  21,  23,  29,  35,  47,  50,  53,  60,
     64,  67,  69,  77,  88,  89,  91, 105, 115, 138, 175, 178, 205,
    207]], dtype=int64)
  

Я хочу удалить все пары x и y, которые находятся на определенном евклидовом расстоянии друг от друга.

Например, здесь (210,16) и (203,18) имеют расстояние меньше 10, и оба должны быть удалены.

Однако перед этим мне сначала нужны все расстояния (что легко), а затем я должен их удалить.

Итак, я создал эту матрицу расстояний:

 distance = np.zeros((27,27))
for i in range (0 , 27):
    for j in range (0 , 27):
        dist= np.linalg.norm(MyData[:,i] - MyData[:,j])
        distance[i,j] = dist
  

затем, используя следующие условия, я нашел свои индексы:

 indx = (np.where((distance >  0) amp; (distance <= 10)))[0]
indy = (np.where((distance > 0) amp; (distance <= 10)))[1]
  

Теперь я не уверен, как фильтровать «MyData», используя индексы, которые я получил от indx и indy.

Комментарии:

1. Вы должны написать программу для этого.

2. Я создал матрицу расстояний, которая в данном случае равна 27 на 27, а затем я нашел индексы целевых значений. Моя проблема в том, что я не знаю, как фильтровать этот 2D массив на основе индексов матрицы 27 на 27!

3. Покажите нам больше того, что вы пробовали, и объясните, как это не удается 🙂

4. Я только что обновил код.

5. Что вы подразумеваете под array [0]?

Ответ №1:

Решение с помощью numpy
сначала подготавливает данные

 import numpy as np
x = np.array([[ 82, 210, 203, 234, 135,  92, 176, 146, 246,  35, 257, 227, 258,
    132,  31, 160, 269,  24, 248, 274, 281, 279,  71,  21, 188, 163,
    243],
   [ 15,  16,  18,  18,  19,  21,  23,  29,  35,  47,  50,  53,  60,
     64,  67,  69,  77,  88,  89,  91, 105, 115, 138, 175, 178, 205,
    207]]).T
  

Вычислите расстояния для всех пар точек

 a,b = np.tril_indices(27, -1)
diss = np.linalg.norm(x[b] - x[a], axis=1)
  

Найдите точки с расстоянием, меньшим порогового значения

 distance = 10
near = x[np.unique(np.concatenate([b[diss < distance], a[diss < distance]]))]
  

Затем мы можем построить точки

 import matplotlib.pyplot as plt

plt.scatter(x[:,0], x[:,1])
plt.scatter(near[:,0], near[:,1]);
  

точки меньше расстояния 10

Чтобы удалить точки

 remove = np.delete(x,np.unique(np.concatenate([b[diss < distance], a[diss < distance]])), axis=0)
plt.scatter(remove[:,0], remove[:,1]);
  

введите описание изображения здесь