Funktionen zur Übersicht über wiederholte Indizes
Posted: 04 Feb 2025, 16:02
Wir suchen nach Möglichkeiten, diesen kleinen Schritt in einer großen Pipeline zu verbessern, die wir entwickeln. Das Problem ist:
Geben: multiple np.ndarray Objekte des ganzzahligen Datenatyps, die Pixelindizes und einen einzelnen NP.NDARRAY vom schwimmenden Typ, der ein Gewicht beschreibt. Alle diese Arrays haben die gleiche Form/Größe. ist jetzt eindeutig durch Konstruktion). Eine ziemlich robuste Methode, aber es ist ziemlich langsam. Betrachten Sie: < /p> mit diesen Einstellungen sehr langsam ist. Wir haben ein paar Dinge ausprobiert: Verwenden von CSR_Matrix oder numba , und aus verschiedenen Gründen waren sie nicht viel besser. diese Arten von Berechnungen durchzuführen?
Geben: multiple np.ndarray Objekte des ganzzahligen Datenatyps, die Pixelindizes und einen einzelnen NP.NDARRAY vom schwimmenden Typ, der ein Gewicht beschreibt. Alle diese Arrays haben die gleiche Form/Größe. ist jetzt eindeutig durch Konstruktion). Eine ziemlich robuste Methode, aber es ist ziemlich langsam. Betrachten Sie: < /p>
Code: Select all
x = np.array([1, 1, 2, 2, 3, 3, 1, 1, 3, 3, 4], dtype=np.uint16)
y = np.array([1, 1, 2, 2, 2, 2, 1, 1, 3, 4, 5], dtype=np.uint16)
l = np.array([1, 2, 2, 2, 3, 2, 1, 1, 3, 3, 6], dtype=np.uint16)
v = np.array([2, 4, 6, 8, 7, 5, 3, 1, 8, 6, 4], dtype=np.float64)
indices = (x, y, l)
dims = [np.amax(index) + 1 for index in indices]
idx = np.ravel_multi_index(indices, dims, order='F')
out, uind, cinv = np.unique(idx, return_index=True, return_inverse=True)
vv = np.bincount(cinv, weights=v)
out = tuple(index[uind] for index in indices)
ret = (vv, *out)
< /code>
Dies funktioniert und gibt das erwartete Ergebnis zurück: < /p>
print(vv, out)
< /code>
array([ 6., 4., 14., 5., 7., 8., 6., 4.])
array([1, 1, 2, 3, 3, 3, 3, 4], dtype=uint16)
array([1, 1, 2, 2, 2, 3, 4, 5], dtype=uint16)
array([1, 2, 2, 2, 3, 3, 3, 6], dtype=uint16)
< /code>
Dies ist ein MWE mit kleinen Arrays, aber in der Praxis sind diese Arrays weit über eine Million Elemente. Und dies wirft das Problem auf, dass der Anruf bei NP.unique