Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.12.2014
Сообщений: 44

Сортировка двух массивов точек X и Y

05.11.2022, 23:03. Показов 797. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Задача следующая - отсортировать один массив точек относительно второго так, чтобы убрать из первого массива точки, которые попадают в некую окрестность вокруг точек второго массива. Грубо говоря (см. изображение), нужно убрать те зеленые точки, которые попадают на красные (радиус красных точек можно менять). Написал такой вариант, работает при первом проходе, далее получаю ошибку "индекс списка вне диапазона". Помогите, пожалуйста, решить данную проблему. Заранее благодарю за помощь.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
X = [[764, 225], [257, 274], [757, 228], [256, 65], [66, 295], [777, 118], [616, 228], [757, 66], [403, 47], [263, 226],
     [609, 271], [255, 48], [777, 218], [59, 48], [609, 225], [613, 67], [601, 294], [407, 108], [421, 226], [405, 294],
     [606, 46], [776, 219], [404, 48], [263, 292], [395, 228], [409, 227], [60, 48], [609, 227], [750, 47], [610, 226],
     [412, 271], [262, 229], [258, 277], [407, 110], [396, 293], [65, 294], [776, 221], [608, 228], [257, 107], [263, 47],
     [260, 112], [612, 109], [613, 80], [407, 48], [603, 295], [614, 228], [251, 295], [608, 47], [407, 295], [412, 47],
     [60, 272], [255, 228], [256, 110], [414, 47], [410, 113], [261, 225], [611, 112], [754, 60], [762, 226], [257, 47],
     [68, 294], [757, 65], [60, 265], [426, 295], [776, 118], [748, 47], [602, 295], [405, 110], [415, 294], [405, 293],
     [777, 119], [411, 272], [409, 113], [616, 110], [616, 293], [420, 293], [401, 225], [260, 109], [609, 272], [756, 291],
     [610, 225], [609, 110], [754, 293], [616, 295], [249, 294], [756, 110], [250, 293], [610, 273], [264, 47], [756, 293],
     [265, 46], [259, 225], [410, 110], [415, 280], [262, 47], [405, 288], [757, 108], [407, 50], [257, 108], [412, 229],
     [615, 271], [622, 48], [614, 65], [408, 225], [256, 228], [259, 227], [758, 66], [420, 272], [757, 110], [757, 229],
     [757, 293], [260, 225], [60, 273], [776, 117], [256, 276], [256, 47], [262, 271], [749, 47], [609, 107], [769, 114],
     [418, 295], [398, 225], [59, 259], [616, 57], [770, 115], [409, 109], [777, 221], [60, 49], [611, 225], [262, 291],
     [261, 112], [401, 272], [407, 47], [607, 47], [412, 226], [396, 294], [62, 278], [612, 226], [249, 293], [756, 228],
     [263, 48], [425, 293], [417, 225], [615, 295], [264, 293], [263, 295], [620, 47], [609, 47], [611, 108], [257, 263],
     [757, 107], [262, 49], [757, 290], [614, 110], [608, 48], [622, 47], [616, 61], [257, 110], [407, 259], [612, 112],
     [264, 295], [265, 294], [609, 49]]
 
 
points_poly_original = [[60, 49], [60, 272], [68, 294], [250, 293], [257, 274], [259, 227], [262, 229], [262, 291],
                [265, 294], [405, 293], [409, 227], [412, 229], [412, 271], [420, 293], [601, 294], [609, 271],
                [608, 228], [611, 225], [614, 228], [616, 293], [754, 293], [757, 290], [757, 229], [777, 218],
                [777, 119], [757, 108], [757, 65], [748, 47], [622, 48], [614, 65], [612, 109], [609, 107],
                [609, 49], [606, 46], [414, 47], [410, 110], [407, 108], [407, 50], [403, 47], [265, 46], [262, 49],
                [260, 109], [257, 108], [255, 48]]
Python
1
2
3
4
5
6
radius = 5
for i in range(len(points_poly_original)):
    for j in range(len(X)):
        if X[j][0] in range(points_poly_original[i][0] - radius, points_poly_original[i][0] + radius) \
                and X[j][1] in range(points_poly_original[i][1] - radius, points_poly_original[i][1] + radius): 
            X.remove(X[j])
Миниатюры
Сортировка двух массивов точек X и Y  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2022, 23:03
Ответы с готовыми решениями:

Дано N(N>3) точек на координатной плоскости в виде двух вещественных массивов X и Y. Определить треугольник
Дано N(N>3) точек на координатной плоскости в виде двух вещественных массивов X и Y. Определить треугольник. С наибольшей площадью....

Сортировка двух массивов
Здравствуйте. Помогите разрешить проблему. Есть два массива, один одномерный, второй двумерный. Нужно отсортировать одномерный и...

Сортировка двух массивов
В точности задание звучит следующим образом: Для двух одинаковых по размеру одномерных массивов определить какой из них требует больше...

4
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
06.11.2022, 10:50
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def distance(point1, point2, dim=2):
    return sum(abs(point1[i]-point2[i]) for i in range(dim))
 
def distance_set(point, iterable):
    return min(distance(point, x) for x in iterable)
 
def filter_points(to_filter, original_set, threshold):
    return [x for x in to_filter if distance_set(x, original_set) >= threshold]
 
X = [[764, 225], [257, 274], [757, 228], [256, 65], [66, 295], [777, 118], [616, 228], [757, 66], [403, 47], [263, 226],
     [609, 271], [255, 48], [777, 218], [59, 48], [609, 225], [613, 67], [601, 294], [407, 108], [421, 226], [405, 294],
     [606, 46], [776, 219], [404, 48], [263, 292], [395, 228], [409, 227], [60, 48], [609, 227], [750, 47], [610, 226],
     [412, 271], [262, 229], [258, 277], [407, 110], [396, 293], [65, 294], [776, 221], [608, 228], [257, 107], [263, 47],
     [260, 112], [612, 109], [613, 80], [407, 48], [603, 295], [614, 228], [251, 295], [608, 47], [407, 295], [412, 47],
     [60, 272], [255, 228], [256, 110], [414, 47], [410, 113], [261, 225], [611, 112], [754, 60], [762, 226], [257, 47],
     [68, 294], [757, 65], [60, 265], [426, 295], [776, 118], [748, 47], [602, 295], [405, 110], [415, 294], [405, 293],
     [777, 119], [411, 272], [409, 113], [616, 110], [616, 293], [420, 293], [401, 225], [260, 109], [609, 272], [756, 291],
     [610, 225], [609, 110], [754, 293], [616, 295], [249, 294], [756, 110], [250, 293], [610, 273], [264, 47], [756, 293],
     [265, 46], [259, 225], [410, 110], [415, 280], [262, 47], [405, 288], [757, 108], [407, 50], [257, 108], [412, 229],
     [615, 271], [622, 48], [614, 65], [408, 225], [256, 228], [259, 227], [758, 66], [420, 272], [757, 110], [757, 229],
     [757, 293], [260, 225], [60, 273], [776, 117], [256, 276], [256, 47], [262, 271], [749, 47], [609, 107], [769, 114],
     [418, 295], [398, 225], [59, 259], [616, 57], [770, 115], [409, 109], [777, 221], [60, 49], [611, 225], [262, 291],
     [261, 112], [401, 272], [407, 47], [607, 47], [412, 226], [396, 294], [62, 278], [612, 226], [249, 293], [756, 228],
     [263, 48], [425, 293], [417, 225], [615, 295], [264, 293], [263, 295], [620, 47], [609, 47], [611, 108], [257, 263],
     [757, 107], [262, 49], [757, 290], [614, 110], [608, 48], [622, 47], [616, 61], [257, 110], [407, 259], [612, 112],
     [264, 295], [265, 294], [609, 49]]
 
points_poly_original = [[60, 49], [60, 272], [68, 294], [250, 293], [257, 274], [259, 227], [262, 229], [262, 291],
                [265, 294], [405, 293], [409, 227], [412, 229], [412, 271], [420, 293], [601, 294], [609, 271],
                [608, 228], [611, 225], [614, 228], [616, 293], [754, 293], [757, 290], [757, 229], [777, 218],
                [777, 119], [757, 108], [757, 65], [748, 47], [622, 48], [614, 65], [612, 109], [609, 107],
                [609, 49], [606, 46], [414, 47], [410, 110], [407, 108], [407, 50], [403, 47], [265, 46], [262, 49],
                [260, 109], [257, 108], [255, 48]]
 
X_filter = filter_points(X, points_poly_original, 5 )
print(*X_filter)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
06.11.2022, 15:02
Цитата Сообщение от hamemeles Посмотреть сообщение
отсортировать один массив точек относительно второго
- это что-то новое в теме "сортировка"...
0
5514 / 2867 / 571
Регистрация: 07.11.2019
Сообщений: 4,751
06.11.2022, 20:09
hamemeles, Если нужна скорость, то можно так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
from  scipy.spatial.distance import cdist, squareform
radius = 5
X = np.array([[764, 225], [257, 274], [757, 228], [256, 65], [66, 295], [777, 118], [616, 228], [757, 66], [403, 47], [263, 226],
     [609, 271], [255, 48], [777, 218], [59, 48], [609, 225], [613, 67], [601, 294], [407, 108], [421, 226], [405, 294],
     [606, 46], [776, 219], [404, 48], [263, 292], [395, 228], [409, 227], [60, 48], [609, 227], [750, 47], [610, 226],
     [412, 271], [262, 229], [258, 277], [407, 110], [396, 293], [65, 294], [776, 221], [608, 228], [257, 107], [263, 47],
     [260, 112], [612, 109], [613, 80], [407, 48], [603, 295], [614, 228], [251, 295], [608, 47], [407, 295], [412, 47],
     [60, 272], [255, 228], [256, 110], [414, 47], [410, 113], [261, 225], [611, 112], [754, 60], [762, 226], [257, 47],
     [68, 294], [757, 65], [60, 265], [426, 295], [776, 118], [748, 47], [602, 295], [405, 110], [415, 294], [405, 293],
     [777, 119], [411, 272], [409, 113], [616, 110], [616, 293], [420, 293], [401, 225], [260, 109], [609, 272], [756, 291],
     [610, 225], [609, 110], [754, 293], [616, 295], [249, 294], [756, 110], [250, 293], [610, 273], [264, 47], [756, 293],
     [265, 46], [259, 225], [410, 110], [415, 280], [262, 47], [405, 288], [757, 108], [407, 50], [257, 108], [412, 229],
     [615, 271], [622, 48], [614, 65], [408, 225], [256, 228], [259, 227], [758, 66], [420, 272], [757, 110], [757, 229],
     [757, 293], [260, 225], [60, 273], [776, 117], [256, 276], [256, 47], [262, 271], [749, 47], [609, 107], [769, 114],
     [418, 295], [398, 225], [59, 259], [616, 57], [770, 115], [409, 109], [777, 221], [60, 49], [611, 225], [262, 291],
     [261, 112], [401, 272], [407, 47], [607, 47], [412, 226], [396, 294], [62, 278], [612, 226], [249, 293], [756, 228],
     [263, 48], [425, 293], [417, 225], [615, 295], [264, 293], [263, 295], [620, 47], [609, 47], [611, 108], [257, 263],
     [757, 107], [262, 49], [757, 290], [614, 110], [608, 48], [622, 47], [616, 61], [257, 110], [407, 259], [612, 112],
     [264, 295], [265, 294], [609, 49]], dtype=np.uint32)
 
 
points_poly_original =np.array( [[60, 49], [60, 272], [68, 294], [250, 293], [257, 274], [259, 227], [262, 229], [262, 291],
                [265, 294], [405, 293], [409, 227], [412, 229], [412, 271], [420, 293], [601, 294], [609, 271],
                [608, 228], [611, 225], [614, 228], [616, 293], [754, 293], [757, 290], [757, 229], [777, 218],
                [777, 119], [757, 108], [757, 65], [748, 47], [622, 48], [614, 65], [612, 109], [609, 107],
                [609, 49], [606, 46], [414, 47], [410, 110], [407, 108], [407, 50], [403, 47], [265, 46], [262, 49],
                [260, 109], [257, 108], [255, 48]], dtype=np.uint32)
 
V=cdist(X, points_poly_original, 'cityblock')
idx=np.all(V>radius, axis=1)
X=X[idx]
Добавлено через 14 минут
Возможно метрика 'chebyshev' - правильнее..
1
0 / 0 / 0
Регистрация: 27.12.2014
Сообщений: 44
06.11.2022, 21:53  [ТС]
Red white socks, u235, благодарю за помощь! Мне удалось исправить свой код, он проигрывает Вашим решениям по времени (замеры: мой - 28 мс, Red white socks - 9 мс, u235 - 1 мс). Моя версия сокращает массив с 163 элементов до 26, версия Red white socks до 32 элементов, версия u235 на метрике 'cityblock' до 28, а на метрике 'chebyshev' до 22 элементов. Еще раз спасибо за помощь и за другие варианты возможного решения, как неопытному программисту это очень полезно.

P.S. Немного вопрос не по теме - может, кто-то может подсказать возможные пути решения вытекающей новой задачи из этой - как можно определить максимальное скопление отсортированных точек? Я пробовал метод k-mean, но для него нужно для каждого случая подбирать количество кластеров индивидуально. Работает построение гистограммы, но это больше визуальный метод. Нашел еще в интернете вариант посчитать мат. ожидание и дисперсию для данного массива. Еще не пробовал, завтра протестирую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.11.2022, 21:53
Помогаю со студенческими работами здесь

Сортировка двух массивов
Нужно отсортировать массивы x (50) и y (60) по возрастанию. Сортировку осуществлять в процедуре. Жду, заранее благодарен!

Сортировка двух динамических массивов
Доброго времени суток. Нужна программа которая два динамических массива объединит в один массив и отсортирует его так : сначала четные...

Сортировка вывода двух массивов
Есть два ассоциативных массива нужно вывести их в цикле, так что бы сортировались по дате: //$arr1 = "11.08.2016 13:00";...

Сложение двух массивов, сортировка
Задача состоит в сложении 2х массивов. Программу я уже написала, проблема только в том что вконце нужно сделать сортировку пузырьком, дабы...

Сортировка двух одномерных массивов
Из двух упорядоченных одномерных массивов (длины K и N) сформируйте одномерный массив размером K+N, упорядоченный так же, как исходные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru