2017-03-21 5 views
0

Ich habe 2 Listen von Positionstupel (x, y Daten). Ich möchte 2 Arrays oder Listen der Indizes für Positionen (oder ein Tupel), die in beiden Listen sind, zurückgeben. Die Positionsdatenwerte sind jedoch nicht exakt gleich, es wird eine Ungenauigkeit von +/- 4 sowohl für die X- als auch die Y-Koordinaten geben.Finden fast gleiche Tupel-Mitglieder von zwei Arrays?

Zum Beispiel:

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)] 

sollte es zurück:

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

oder:

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

Entweder man wäre in Ordnung zu verwenden.

Gibt es in Python eine Funktion, die die Indizes übereinstimmender Daten in 2 Listen zurückgibt, indem auch ein +/- Wert angegeben wird?

Ich muss dies für 3 Listen von ~ 400 Tupel jedes tun, die nicht gleich groß sind.

ich auch mit so etwas wie zu denken war:

common=[a in A for a in B] 

und irgendwie einen Bereich für a Angabe nur auf der x- und y-Daten suchen und die Indizes statt wahr/falsch zurück, aber ich wirklich don Ich weiß nicht, wie ich das angehen soll. Ist eine Schleife die einzige Möglichkeit, dies zu tun, indem Sie jeden Wert einzeln betrachten, einen Unterschied zwischen ihnen erkennen und sehen, ob dies < 4 ist, und dann die Indizes bekommen?

+0

Wenn Sie Array sagen, meinen Sie "Liste"? –

+0

Aber es gibt keine eingebaute Funktionalität wie Sie beschrieben haben. –

+0

Liste oder Array, habe ich den ursprünglichen Beitrag aktualisiert – gline

Antwort

0

Wie wäre es mit einer Brute-Force-Lösung?

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)] 

Natürlich können Sie die bedingte mit was auch immer Sie wollen ersetzen. Wahrscheinlich ist die Verwendung von math.isclose eine gute Idee. Es kann eine bessere Möglichkeit geben, dies vektorisiert zu tun. Aber das sollte funktionieren, wenn Effizienz keine Rolle spielt.

+0

Das ist vielleicht die Art, wie ich gehen muss. Ich habe versucht, Schleifen zu vermeiden .... aber ich kann auch nicht anders sehen. Danke für die Antwort. – gline

+0

@gline angesichts des Umfangs des Problems, das Sie beschrieben haben, glaube ich nicht, dass es ein Problem sein wird. –

+0

Es stellt sich heraus, dass es tatsächlich ein Wörterbuch von Tupeln ist, das ich benutze, wenn ich diesen Code benutze und z. A [0] statt A Ich erhalte den Fehler "zu viele Werte zum Entpacken (erwartet 2)" – gline

0

Vielleicht können Sie die Funktion von math Modul in Betracht ziehen?

+0

Von dem, was ich sehen kann, überprüft dies die 2 Arrarays in vollem Umfang? – gline

+0

Es vergleicht zwei Werte [siehe hier] (https://www.python.org/dev/peps/pep-0485/) – jedruniu

+0

danke, ich werde einen Blick auf den Link – gline

Verwandte Themen