Zählen Sie Instanzen jeder eindeutigen Ganzzahl in einem Vektor in 1 Codezeile?

7

Gibt es einen glatten Weg, um diese Julia-Funktion neu zu schreiben, vielleicht mit nur einer Zeile Code, ohne es viel langsamer zu machen? (Ich habe Julia gerade benutzt. Es ist großartig!)% Co_de% ist eine positive ganze Zahl und K ist ein Vektor positiver Ganzzahlen, der nicht größer als zd ist. Danke!

%Vor%

Beispiel:

%Vor%     
Jeff 16.01.2014, 20:19
quelle

5 Antworten

5

Ich habe die Leistung nicht getestet, aber die Verwendung der Hist-Funktion sollte funktionieren:

%Vor%

gibt:

5-Element-Array {Int64,1}:  1  4  1  0  0

oder, wenn die Nullen unwichtig sind, verwenden Sie einfach

%Vor%     
meggart 16.01.2014, 21:23
quelle
8

Jede Alternative wird wahrscheinlich nicht schneller sein. Ihre Schleife führt bereits nur einen Durchlauf durch das Array durch. Julia-Schleifen sind schnell und es gibt keinen Geschwindigkeitsvorteil gegenüber vektorisiertem Code, wie es in anderen Sprachen der Fall ist.

Schauen Sie sich Julia's Implementierung der Funktion hist an. Diese stammt direkt aus der Julia Standard Library :

%Vor%

Der Parameter "edg" enthält die Kanten der Bins. Wenn wir dieses Feature entfernen, erhalten wir genau die Funktion, die Sie geschrieben haben.

    
DanielC 18.01.2014 04:50
quelle
6

Hier Ссылка

%Vor%     
Bogdan Ruzhitskiy 19.02.2016 00:21
quelle
3

Es gibt eine Reihe von Zählfunktionen , die im StatsBase.jl Paket. Ihre Tally-Funktion entspricht counts(zd, 1:K) .

Es gibt auch Methoden zum Zählen von eindeutigen Elementen anderer Typen als Integer, wie zum Beispiel countmap , die ein Dictionary zurückgibt, das eindeutige Werte auf die Anzahl der Vorkommen abbildet.

    
Matt B. 10.07.2015 15:03
quelle
2

Ich weiß es alt, aber wie wäre es mit

[sum(zd .== i) for i in unique(zd)]

in einem kurzen Test hat es besser abgeschnitten als Ihre anfängliche Funktion (zeit- und speichertechnisch).

Achtung: Ergebnis nicht sortiert!

    
niko 11.04.2017 14:39
quelle

Tags und Links