Нахождение почти равных членов кортежа из двух массивов?
У меня есть 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
модуль?