Проверка, попадают ли точки в окружности - PullRequest
0 голосов
/ 02 октября 2019

У меня длинный список H-points с известными координатами. У меня также есть список TP-points. Я хотел бы знать, попадает ли H-points в любой (!) TP-point с определенным радиусом (например, r=5).

dfPoints = pd.DataFrame({'H-points' : ['a','b','c','d','e'],
               'Xh' :[10, 35, 52, 78, 9],
               'Yh' : [15,5,11,20,10]})

dfTrafaPostaje = pd.DataFrame({'TP-points' : ['a','b','c','d','e'],
               'Xt' :[15,25,35],
               'Yt' : [15,25,35],
               'M' : [5,2,3]})

def inside_circle(x, y, a, b, r):
    return (x - a)*(x - a) + (y - b)*(y - b) < r*r

Я начал, но ... это было бы оченьпроще проверить это только для одной точки TP. Но если у меня есть, например, 1500 из них и 30 000 H-точек, то мне нужно более общее решение. Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Другой вариант - использовать distance_matrix из scipy.spatial:

dist_mat = distance_matrix(dfPoints [['Xh','Yh']], dfTrafaPostaje [['Xt','Yt']])
dfPoints [np.min(dist_mat,axis=1)<5]

Взял около 2 с для 1500 dfPoints и 30000 dfTrafaPostje.


Обновление: чтобы получить индекс контрольных точек с наивысшей оценкой:

dist_mat = distance_matrix(dfPoints [['Xh','Yh']], dfTrafaPostaje [['Xt','Yt']])

# get the M scores of those within range
M_mat = pd.DataFrame(np.where(dist_mat <= 5, dfTrafaPosaje['M'].values[None, :], np.nan),
                     index=dfPoints['H-points'] ,
                     columns=dfTrafaPostaje['TP-points'])

# get the points with largest M values
# mask with np.nan for those outside range    
dfPoints['M'] = np.where(M_mat.notnull().any(1), M_mat.idxmax(1), np.nan)

Для включенных данных выборки:

  H-points  Xh  Yh   TP
0        a  10  15    a
1        b  35   5  NaN
2        c  52  11  NaN
3        d  78  20  NaN
4        e   9  10  NaN
1 голос
/ 03 октября 2019

Вы можете использовать cdist от scipy для вычисления попарных расстояний, затем создать маску с True, где расстояние меньше радиуса, и, наконец, отфильтровать:

import pandas as pd
from scipy.spatial.distance import cdist

dfPoints = pd.DataFrame({'H-points': ['a', 'b', 'c', 'd', 'e'],
                         'Xh': [10, 35, 52, 78, 9],
                         'Yh': [15, 5, 11, 20, 10]})

dfTrafaPostaje = pd.DataFrame({'TP-points': ['a', 'b', 'c'],
                               'Xt': [15, 25, 35],
                               'Yt': [15, 25, 35]})

radius = 5
distances = cdist(dfPoints[['Xh', 'Yh']].values, dfTrafaPostaje[['Xt', 'Yt']].values, 'sqeuclidean')
mask = (distances <= radius*radius).sum(axis=1) > 0 # create mask

print(dfPoints[mask])

Выход

  H-points  Xh  Yh
0        a  10  15
...