Summe array von Zahl in numpy
Vorausgesetzt, ich habe einen numpy-array wie:
[1,2,3,4,5,6]
und ein weiteres array:
[0,0,1,2,2,1]
Ich möchte, um die Summe der Elemente der ersten array-Gruppe (der zweiten Reihe) und erhalten n-Gruppen-Ergebnisse in der Gruppe Zahl um (in diesem Fall wäre das Ergebnis [3, 9, 9]). Wie mache ich das in numpy?
- Warum brauchen Sie numpy für diese? Sie sind nicht nur mit Vanille-python-Listen? Wenn nicht, was numpy-Typ sind Sie?
- Ich brauche numpy für das, weil ich nicht wollen, um eine Schleife durch das array n-mal für n-Gruppen, da mein array-Größen können beliebig groß sein. Ich bin nicht mit python-Listen, ich war nur mit einem Beispiel-Datensatz in Klammern. Der Datentyp ist int.
- Verwandte stackoverflow.com/questions/7089379/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehr als einen Weg, um dies zu tun, aber hier ist ein Weg:
Du kann Vektorisieren Dinge so, dass es keine for-Schleife, aber ich würde empfehlen, gegen Sie. Es unlesbar wird, und erfordert ein paar 2D-arrays, der Sie möglicherweise große Mengen an Speicher, wenn man eine große Menge von Daten.
Edit: Hier ist eine Möglichkeit, Sie könnten vollständig zu Vektorisieren. Beachten Sie, dass dies kann (und wird wahrscheinlich) langsamer als die version oben. (Und kann es einen besseren Weg, um zu Vektorisieren, aber es ist spät und ich bin müde, so ist dies nur das erste, was zu pop in meinem Kopf...)
Jedoch halten Sie im Verstand, dass dies ein schlechtes Beispiel... Du bist echt besser aus (sowohl in Bezug auf die Geschwindigkeit und Lesbarkeit) mit der Schleife oben...
data[groups == group]
ziemlich schnell.data[groups == group]
Konstrukt? Vergleich eines Arrays zu einem skalaren Erträgen irgendeine Art von Schnitt oder Ansicht? o_ODie numpy-Funktion
bincount
wurde für genau diesen Zweck-und ich bin sicher, es wird viel schneller als die anderen Methoden, die für alle Größen der Eingänge:Dem i-TEN element der output ist die Summe aller
data
Elemente der entsprechenden "id"i
.Hoffe, das hilft.
data
sind Vektoren?Dies ist eine vektorisierte Methode, diese Summe basiert auf der Umsetzung von numpy.einzigartig. Nach meinen timings ist es bis zu 500-mal schneller ist als der loop-Methode und bis zu 100-mal schneller als die Histogramm-Methode.
Wenn die Gruppen indiziert durch aufeinanderfolgende ganze zahlen, die Sie missbrauchen können die
numpy.histogram()
- Funktion, um das Ergebnis zu erhalten:Damit vermeiden Sie, dass die Python-Schleifen.
Ich habe versucht Skripte von allen und meine überlegungen sind:
Joe: Wird nur funktionieren, wenn Sie einige Gruppen.
kevpie: Zu langsam, weil die Schleifen (dies ist nicht pythonic way)
Bi_Rico und Sven: führen Sie gut, aber funktioniert nur für Int32 (wenn die Summe geht über 2^32/2 wird es scheitern)
Alex: ist die Schnellste, gut für die Summe.
Aber wenn Sie wollen, mehr Flexibilität und die Möglichkeit der Gruppierung von anderen Statistiken verwenden SciPy:
Dies ist gut, weil Sie viele Statistiken zu Gruppe (Summe, Mittelwert, Varianz, ...).
Sind Sie alle falsch! Der beste Weg, es zu tun ist:
Einer reinen python-Umsetzung:
Bemerkte ich, dass die
numpy
- tag, aber in Fall, dass Sie nicht dagegen, mitpandas
diese Aufgabe wird zu einem one-liner:So
df
sieht dann wie folgt aus:Nun können Sie die Funktionen
groupby()
undsum()
gibt Ihnen die gewünschte Ausgabe
Standardmäßig ist der dataframe würde sortiert werden, daher nutze ich die Flagge
sort=False
die möglicherweise verbessern die Geschwindigkeit für große dataframes.