Рассчитать количество точек заданного радиуса по координатам X и Y

У меня есть код Python, где при наличии списка точек (пар координат X и Y) в фрейме данных и заданного радиуса круга я бы хотел, чтобы код проходил через каждую точку, рассматривая ее как центр круга и найдите, сколько еще точек находится внутри выделенного круга.

Оглядываясь вокруг, я видел, как люди предлагают подобную проблему с использованием долготы и широты, которую можно решить с помощью BallTree от SciKit-Learn, поэтому я попробовал это, но не получаю ожидаемых ответов. Мой код ниже:

import numpy as np
import pandas as pd
from sklearn.neighbors import BallTree

df = pd.DataFrame({'id':list('abcde'),'X': [10, 1000, 1010, 5000, 5100],'Y': [10, 1000, 1010, 5000, 5100]})

radius = int(input('Enter the selection radius of the circle:'))

coords = df[["X","Y"]]

tree = BallTree(coords, metric='haversine')
answers = tree.query_radius(coords, r=radius, count_only=True)

print(answers)

Например, когда я делаю radius = 100, я получаю ответ [1 1 1 1 1], что неверно. Есть идеи, как заставить это работать самым простым способом в Python?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для случайных координат, которые вы указали, вы должны использовать евклидову геометрию.

tree = BallTree(coords, metric='euclidean')

Хаверсинусу необходимо ввести определенные радианные координаты. Эти значения, которые вы использовали в качестве проверки, не имеют смысла в данном контексте.

После поиска: хаверсинус можно вычислить путем деления значения широты (от -90 до 90) и/или долготы (от -180 до 180), умноженного на число пи / 180. Это означает, что оно не может быть больше, чем примерно 1,5 и 3,14.

Ответ принят как подходящий

Проблема, с которой вы столкнулись, заключается в том, что BallTree используется с метрикой хаверсинуса, которая предназначена для вычисления расстояний на сферической поверхности и обычно используется с координатами долготы и широты. Однако в вашем случае вы работаете с декартовыми координатами (X, Y), где вместо этого следует использовать евклидово расстояние.

Вам следует заменить эту строку:

tree = BallTree(coords, metric='haversine')

С:

tree = BallTree(coords, metric='euclidean')

Привет. Спасибо за информацию о метриках BallTree и о том, какие и когда следует использовать. Однако кажется, что даже когда я меняю metric='euclidean', я все равно получаю неправильный ответ [1 1 1 1 1]. Есть ли еще какой-то аспект BallTree, который я не понимаю?

ConorC 03.09.2024 20:14

Что-то не так с вашей настройкой, попробуйте код в Google Colab. Для меня попытка вашего кода в colab возвращает: [5 5 5 5 5] (хаверсинус и радиус = 100). Но при использовании евклидова и радиуса = 100: он возвращает [1 2 2 1 1]

Youssef Ben hammouda 04.09.2024 00:51

Другие вопросы по теме

Похожие вопросы

Почему некоторые функции регулярных выражений возвращают объект соответствия, а некоторые нет?
Группируйте элементы в фрейме данных и отображайте их в хронологическом порядке
Операции Pandas между типами с плавающей запятой и NaN
Используйте спецификатор формата для преобразования столбца float/int в фрейме данных Polars в строку
Как ВСТАВИТЬ в таблицу с помощью AUTO_INCREMENT?
Дилемма 100 заключенных: кодекс всегда приводит к провалу (все заключенные умирают)
Как устранить ошибку AttributeError: у модуля «Фиона» нет атрибута «Путь»?
Я работаю над тем, чтобы сделать бота Python, который будет нажимать кнопку в списке, который повторяется сам, используя селен
Какие замены регулярных выражений помогают при переписывании SQL-запросов MS Access как простых запросов TSQL? Как их можно зациклить с помощью Excel в качестве входных и выходных данных?
Сообщение об ошибке с использованием нескольких замен строк %s