2017-07-21 3 views
2

Zum Beispiel habe ich einen Strom von Array mit Zahlen im Bereich von 0.0 bis 10.0 inklusive.Schnell zuzuweisen ein Array zu n Bins mit gleicher Länge

Ich möchte die Nummern in arr zu 5 Bins gleicher Länge schnell zuweisen.

Mit gleicher Länge meine ich bin die Intervallintervalle sind [0.0, 2.0), [2.0, 4.0), [4.0, 6.0), [6.0, 8.0), [8.0, 10.0].

Das Problem ist, dass das letzte Intervall nicht das gleiche wie die anderen Intervalle ist.

Test:

import numpy as np 
# Things we know and can pre-calculate 
n_bins = 5 
minimal = 0.0 
maximal = 10.0 
reciprocal_bin_length = n_bins/(maximal - minimal) 

# Let's say the stream gives 1001 numbers every time. 
data = np.arange(1001)/100 

norm_data = (data - minimal) * reciprocal_bin_length 
norm_data = norm_data.astype(int) 
print(norm_data.max()) 
print(norm_data.min()) 

Ergebnis:

5 
0 

Der Bin-Index 0 sein soll, 1, 2, 3 oder 4, jedoch nicht 5.

+0

Ich glaube, Sie können für [numpy.digitize] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html) suchen. – Marein

+0

min ist 0. max ist genau 10 so. digitalisieren ermöglicht eine ungleiche Länge und könnte langsamer sein. das ist gleiche Länge. –

+0

was ist mit [pandas.cut] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html) – jeremycg

Antwort

3

A "schlecht Mann Lösung "könnte die minimum zwischen Ihrem Array norm_data und nbins-1:

01 berechnen
norm_data = np.minimum(norm_data,nbins-1) 

Also alle 5 s (und darüber) werden in 4 s umgewandelt werden. Beachten Sie, dass Sie hier natürlich keine richtige Bereichsüberprüfung durchführen (120.0 wird auch in Bin 4 landen).

0

Wenn 0,1% Fehler akzeptabel ist, ist das Folgende ein bisschen schneller. Nicht sicher, ob dies mit Fließkomma-Rundung in Ordnung ist.

import numpy as np 
# Things we know and can pre-calculate 
n_bins = 5 
minimal = 0.0 
maximal = 10.0 
approx = 1.001 # <-- this is new 
reciprocal_bin_length = n_bins/(maximal*approx - minimal) 

# Let's say the stream gives 1001 numbers every time. 
data = np.arange(1001)/100 

# can use numexpr for speed. 
norm_data = (data - minimal) * reciprocal_bin_length 
norm_data = norm_data.astype(int) 
print(norm_data.max()) 
print(norm_data.min()) 
+0

nicht zuverlässig. Ich habe am Ende numpy.clip benutzt. –

+0

Clipping auf 0 und n_bins - 1 –

Verwandte Themen