Нахождение почти равных членов кортежа из двух массивов?

У меня есть 2 списка позиционных кортежей (данные x,y). Я хотел бы вернуть 2 массива или списки индексов для позиций (или кортеж), которые находятся в обоих списках. Однако значения позиционных данных не будут в точности равны, в координатах x и y будет неопределенность +/- 4.

Например:

A=[(1168.593,9.874), (1799.244,40.201),(780.533,12.636)]
B=[(1170.909,8.194), (793.149,10.885), (1801.493,41.603)]

должно вернуться:

c=[(0,0),(1,2)]

или же:

d=[0,1] #indexes for A
e=[0,2] #indexes for B

Любой из них будет в порядке.

Есть ли в Python функция, которую вы можете использовать, которая возвращает индексы совпадающих данных в 2 списках, также указав значение +/-?

Мне нужно сделать это для 3 списков по ~400 кортежей в каждом, которые не равны по размеру.

Я думал о том, чтобы даже использовать что-то вроде:

common=[a in A for a in B]

и как-то указав диапазон для aЯ просто смотрю на данные x и y и возвращаю индексы вместо true/false, но я действительно не знаю, как подойти к этому. Является ли цикл единственным способом сделать это, просматривая каждое значение отдельно, получая разницу между ними и выясняя, если это < 4, а затем получая индексы?

2 ответа

Решение

Как насчет грубой силы решения?

In [5]: c = []

In [6]: for i, (x1, y1) in enumerate(A):
   ...:     for j, (x2, y2) in enumerate(B):
   ...:         if (x1 - 4 <= x2 <= x1 + 4) and (y1 - 4 <= y2 <= y1 + 4):
   ...:             c.append((i,j))
   ...:
   ...:

In [7]: c
Out[7]: [(0, 0), (1, 2)]

Конечно, вы можете заменить условное на то, что вы хотите. Скорее всего, используя math.isclose хорошая идея Там может быть лучше numpy способ сделать это в векторизованном виде. Но это должно работать, если эффективность не является проблемой.

Возможно, вы можете рассмотреть возможность использования функции isclose от math модуль?

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