Summierung von Daten aus einem Array basierend auf einem anderen Array in Numpy

8

Ich habe zwei 2D-Nummernfelder (in diesem Beispiel in Bezug auf Größe und Inhalt vereinfacht) mit identischen Größen.

Eine ID-Matrix:

%Vor%

und eine Wertematrix:

%Vor%

Mein Ziel ist zu zählen und Summe die Werte aus der zweiten Matrix gruppiert durch die IDs aus der ersten Matrix:

%Vor%

Ich kann dies in einer for -Schleife tun, aber wenn die Matrizen Größen in Tausend statt nur 5x5 und Tausende von eindeutigen IDs haben, braucht es viel Zeit für die Verarbeitung.

Hat numpy eine clevere Methode oder eine Kombination von Methoden dafür?

    
Chau 15.04.2016, 09:22
quelle

3 Antworten

5

Hier ist ein vektorisierter Ansatz, um die Zählungen für ID und ID-based summierte Werte für value mit einer Kombination von np.unique und np.bincount -

%Vor%

Um die endgültige Ausgabe als Wörterbuch zu erhalten, können Sie das Schleifenverständnis verwenden, um die summierten Werte zu sammeln, wie zum Beispiel -

%Vor%

Beispiellauf -

%Vor%     
Divakar 15.04.2016, 09:40
quelle
1

Dies ist mit einer Kombination einiger einfacher Methoden möglich:

  1. Verwenden Sie numpy.unique , um jede ID
  2. erstellt für jede ID eine boolesche Maske
  3. summiere die 1en in der Maske (Anzahl) und die Werte, bei denen die Maske 1 ist

Das kann so aussehen:

%Vor%     
kazemakase 15.04.2016 09:34
quelle
0

Das numpy_indexed -Paket (Disclaimer: Ich bin der Autor) hat eine Funktionalität, um diese Art von Problemen elegant und vektorisiert zu lösen :

%Vor%

Hinweis: Wenn Sie die Summe und die Anzahl berechnen wollen, um einen Mittelwert zu berechnen, gibt es auch group_by.mean; plus viele andere nützliche Funktionen.

    
Eelco Hoogendoorn 15.04.2016 10:47
quelle