2017-03-21 9 views
0

두 개의 위치 튜플 목록 (x, y 데이터)이 있습니다. 나는 두 배열 또는 두 목록에있는 위치 (또는 튜플)에 대한 인덱스 목록을 반환하고 싶습니다. 그러나 위치 데이터 값은 정확하게 동일하지 않을 것이며, x와 y 좌표 모두에서 +/- 4의 uncertianty가있을 것입니다. 예를 들어두 배열의 거의 동일한 튜플 멤버를 찾고 있습니까?

:

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 

어느 하나를 사용하는 것이 잘 될 것입니다.

+/- 값을 지정하여 2 개의 목록에서 일치하는 데이터의 색인을 반환하는 Python 함수가 있습니까?

크기가 같지 않은 ~ 400 개의 튜플로 구성된 3 개의 목록에 대해이 작업을 수행해야합니다.

심지어 같은 것을 사용하는 생각

:

common=[a in A for a in B] 

어떻게 든 a의 범위를 지정, 단지 인덱스를 x와 y 데이터를보고 돌아 대신 참/거짓,하지만 난 정말 돈 이 접근법을 알지 못합니다. 루프는 유일한 방법입니다. 각 값을 따로보고, 차이점을 확인한 후 < 4인지 확인한 다음 색인을 얻으시겠습니까?

+0

배열을 말할 때'list'를 의미합니까? –

+0

그러나 설명 된 것처럼 기본 제공 기능은 없습니다. –

+0

목록 또는 배열, 원래 게시물을 – gline

답변

0

무차별 솔루션은 어떻습니까?

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 그러나 효율성이 문제가되지 않는다면 이는 효과가있다.

+0

이것은 내가해야 할 방법 일 것입니다. 나는 반복하는 것을 피하려고 노력하고 있었다. ... 그러나 나는 또한 다른 방법을 볼 수 없다. 답변 해주셔서 감사합니다. – gline

+0

@gline 설명 된 문제의 범위가 주어지면 문제가 될 것이라고 생각하지 않습니다. –

+0

실제로이 튜토리얼은 내가 사용하고있는 튜플의 사전입니다. A 대신 [0]을 사용합니다. "포장을 푸는 데 너무 많은 값 (예상 2)"이 나타납니다. – gline

0

isclosemath 모듈의 기능을 사용하는 것이 좋습니다.

+0

내가 볼 수있는 것으로부터, 이것은 2 개의 arrrays 전체를 검사합니까? – gline

+0

두 가지 값을 비교합니다. [여기를보십시오] (https://www.python.org/dev/peps/pep-0485/) – jedruniu

+0

고맙습니다. 링크를 살펴 보겠습니다. – gline