Vektorisieren Sie die Suche nach Übereinstimmungen zwischen Numpy-ArraysPython

Python-Programme
Anonymous
 Vektorisieren Sie die Suche nach Übereinstimmungen zwischen Numpy-Arrays

Post by Anonymous »

Ich versuche zu überprüfen, wie viele Elemente in einem Numpy-Array mit einer bestimmten Toleranz in einem anderen Numpy-Array gefunden werden können. Bisher habe ich eine for-Schleife verwendet, um meine Vergleichslogik anzuwenden. Ich vermute jedoch, dass es eine elegante Lösung mit einem vektorisierten Ansatz gibt.
Die Numpy-Arrays haben die folgende Struktur:

Code: Select all

ch1 = array([     41,      53,      334, ..., 1180949, 1181054, 1181081], shape=(N,))

ch2 = array([     85,     221,     335, ..., 1180996, 1181055, 1181087], shape=(M,)))
wobei N und M große Zahlen sein können (und nicht unbedingt gleich sind), die Einträge streng monoton ansteigend sind (alle Einträge in jedem Array sind eindeutig und in aufsteigender Reihenfolge sortiert) und es keine Duplikate zwischen den beiden Arrays gibt, d. h. Werte in ch1 sind in ch2 nicht vorhanden.
Was ich versuche, ist, die Elemente von ch1 zu zählen, die sich von den Elementen von unterscheiden ch2 um 1. Um ein Beispiel zu geben: Betrachtet man die Arrays oben, unterscheidet sich das Element 334 von ch1 um 1 vom Element 335 von ch2, daher zählen wir diesen Eintrag. Das Gleiche gilt für Eintrag 1181054 von ch1 und Eintrag 1181055 von ch2.
Die Art und Weise, wie die Arrays erstellt werden, stellt sicher, dass es in jedem Array nur ein Element gibt, das die Einschränkung erfüllt, da:
  • zwei aufeinanderfolgende Zahlen in jedem Array mindestens 2 Einheiten voneinander entfernt sind, z. B. ch1 = array([3, 25, ..., 32, 34, ..., 18762, 18764, ...])
  • Wenn sich zwei Elemente in einem Array um 2 unterscheiden, dann hat das andere Array nicht die Zahl zwischen den beiden, d. h. wenn wir in ch2 die Elemente 41 und 43 haben, dann wird ch1 kein Element haben 42, aber entweder Element 40 oder 44
  • für jedes gegebene Element eines Arrays gibt es nur ein Element des anderen Arrays, das sich um 1 Einheit unterscheidet
Das Problem, das ich habe, ist, dass ich nicht einfach (ch1 - ch2) oder (ch2 - ch1) ausführen kann, da die beiden Arrays nicht unbedingt die gleiche Form haben, da dies zu einem Ergebnis führt ein Fehler. Bisher habe ich eine for-Schleife über die Einträge von ch1/ch2 verwendet, die Differenz zwischen diesem Wert und dem anderen Array berechnet und den Eintrag gezählt, wenn das Element die Logik erfüllt (unten finden Sie möglicherweise einen Ausschnitt des Codes, den ich erstellt habe).
Gibt es eine Möglichkeit, diese Schleife zu vektorisieren, da dieser Vergleich zwischen den beiden Arrays zwischen Tausenden von Array-Paaren implementiert werden muss und dies mehr als bedeuten würde 100.000 Iterationen.

Code: Select all

counter = 0

for elm in ch1:
t_diff = elm - ch2
found, = numpy.nonzero(numpy.abs(t_diff) == 1)
if found.size > 0:
counter += 1

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post