Ich habe ein numpliges Array mit Labels. Ich würde gerne eine Zahl für jedes Etikett basierend auf seiner Größe und Begrenzungsbox berechnen. Wie kann ich dies effizienter schreiben, so dass es realistisch ist, auf großen Arrays (~ 15000 Etiketten) zu verwenden?
%Vor%Ich konnte dies mit einigen vektorisierten Funktionen von NumPy nicht wirklich effizient umsetzen, daher wird eine clevere Python-Implementierung vielleicht schneller sein.
%Vor% Diese Funktion gibt ein Dictionary zurück, das jedes Label dem Index der ersten Zeile zuordnet, in der es erscheint. Wenn Sie die Funktion auf A
, A.T
, A[::-1]
und A.T[::-1]
anwenden, erhalten Sie auch die erste Spalte die letzte Zeile und Spalte.
Wenn Sie lieber eine Liste als ein Wörterbuch wünschen, können Sie das Wörterbuch mithilfe von map(d.get, labels)
in eine Liste umwandeln. Alternativ können Sie von Anfang an statt eines Wörterbuchs ein NumPy-Array verwenden, aber Sie verlieren die Möglichkeit, die Schleife vorzeitig zu verlassen, sobald alle Beschriftungen gefunden wurden.
Es würde mich interessieren, ob (und wie viel) dies tatsächlich Ihren Code beschleunigt, aber ich bin zuversichtlich, dass es schneller ist als Ihre ursprüngliche Lösung.
Eine andere Methode:
Verwenden Sie bincount (), um die Anzahl der Beschriftungen in jeder Zeile und Spalte zu ermitteln, und speichern Sie die Informationen im Zeilen- und Spalten-Array.
Für jedes Etikett müssen Sie nur den Bereich in Zeilen und Spalten durchsuchen. Es ist schneller als Sortieren, auf meinem PC kann es die Berechnung in ein paar Sekunden tun.
%Vor%Algorithmus:
für große Arrays wie (7000, 9000), kann die Berechnung in 30 Sekunden abgeschlossen werden.
Hier ist der Code:
%Vor% Der Performace-Engpass scheint tatsächlich der Aufruf von argmax
zu sein. Es kann vermieden werden, indem die Schleife wie folgt geändert wird (nur Berechnen von y0, y1, aber leicht verallgemeinern zu x0, x1):
Ich bin nicht sicher über den Grund für den Leistungsunterschied, aber ein Grund könnte sein, dass alle Operationen wie ==
, argmax
und max
ihr Ausgabe-Array direkt von der Form des Eingabe-Arrays vorbelegen können , was für argwhere
nicht möglich ist.
Tags und Links python optimization numpy