I have two lists/flat arrays a
and b
of 2D coordinates (x,y). (a
contains up to ~1000 coordinates, b
up to ~200,000.) I need to filter b
to obtain a list of only those coordinates in b
which are within a certain Euclidean distance, say 10, of any coordinate in a
. For example:
import numpy as np
np.random.seed(123)
a = np.random.randint(50, size=(5, 2))
b = np.random.randint(50, size=(1000, 2))
def dist(coord_a, coord_b):
squ_dist_x = (coord_a[0] - coord_b[0])**2
squ_dist_y = (coord_a[1] - coord_b[1])**2
return np.sqrt(squ_dist_x + squ_dist_y)
b_filter = []
for coord_b in b:
for coord_a in a:
distance = dist(coord_a, coord_b)
if distance <= 5:
b_filter.append(coord_b)
Output for b_filter
:
[array([21, 30]),
array([ 3, 30]),
array([ 4, 30]),
array([48, 32]),
array([ 8, 32]),
array([21, 32]),
array([16, 30]),
array([16, 30]),
array([ 0, 32]),
array([45, 32]),
array([32, 30]),
array([ 3, 31]),
array([21, 30]),
array([20, 31]),
array([ 6, 32]),
array([24, 31]),
array([31, 31]),
array([ 2, 31]),
array([32, 32]),
array([22, 32]),
array([46, 30]),
array([40, 32]),
array([20, 31]),
array([ 4, 32]),
array([31, 31]),
array([35, 30]),
array([37, 32]),
array([ 1, 32]),
array([31, 31]),
array([44, 30]),
array([24, 32]),
array([40, 32]),
array([31, 30]),
array([ 2, 31]),
array([47, 32]),
array([42, 32]),
array([36, 30]),
array([ 8, 31]),
array([19, 30]),
array([42, 31]),
array([48, 31]),
array([ 4, 30]),
array([47, 32]),
array([30, 32]),
array([47, 31]),
array([29, 31]),
array([29, 31]),
array([17, 32]),
array([24, 32]),
array([46, 30]),
array([ 2, 30]),
array([ 4, 30]),
array([27, 30]),
array([ 1, 31]),
array([30, 32]),
array([ 5, 32]),
array([25, 32]),
array([35, 30]),
array([23, 31]),
array([36, 31]),
array([41, 30]),
array([17, 30]),
array([26, 30]),
array([19, 30]),
array([22, 31]),
array([ 2, 31]),
array([23, 32]),
array([30, 30]),
array([ 3, 31]),
array([40, 30])]
except the arrays I need to do this with are way larger. (But only around 5% will be under the distance limit, as in the example) How can I do this most efficiently?