2017-02-05 4 views
0

Ich möchte eine Funktion erstellen, die Zahlen innerhalb eines Bereichs [0,1] in eine Bin platziert, wobei n die Anzahl der Bins und die Grenzen relativ zum Mittelpunkt definiert sind .Python Bins/Numpy Digitize - Erstellen von Bins vom Mittelpunkt

0.0 >= Bin 1 <= 0.2 <- outer left bin 
0.2 > Bin 2 <= 0.4 
0.4 > Bin 3 < 0.6 <- middle bin  
0.6 >= Bin 4 < 0.8 
0.8 >= Bin 5 <= 1 <- outer right bin 

Ich dachte, ich wäre in der Lage, Folgendes zu tun: für

def fractile(x, n): 
    bins = np.linspace(0.0, 1.0, n+1) 
    return np.where(x > 0.5, 
        np.digitize(x, bins, right=False), 
        np.digitize(x, bins, right=True)) 

x = pd.DataFrame(np.linspace(0.05, 0.95, 19)) 
f = fractile(x, 10) 

Ergebnis n = 10:

array([[ 1], 
    [ 1], 
    [ 2], 
    [ 2], 
    [ 3], 
    [ 3], 
    [ 4], 
    [ 4], 
    [ 5], 
    [ 5], 
    [ 6], 
    [ 6], 
    [ 7], 
    [ 7], 
    [ 8], 
    [ 8], 
    [ 9], 
    [10], 
    [10]], dtype=int64) 

Ich erwarte von der Mitte sein, die kleinste ist zu sein, aber erhalten unerwartete Ergebnisse ...

Mit Bezug auf Pauls Antwort unten könnte die Funktion zu runden vor der Auswertung und t ändern herefore mildern die Gleitkomma-Arithmetik Problem scheint aber hässlich:

def fractile(x, n): 
    x = np.round(x, 15) 
    bins = np.round(np.linspace(0.0, 1.0, n+1), 15) 
    return np.where(x > 0.5, 
        np.digitize(x, bins, right=False), 
        np.digitize(x, bins, right=True)) 

Irgendwelche Vorschläge/Zeiger geschätzt!

Antwort

0

Sie erfahren gerade die Ungenauigkeit der Fließkommaarithmetik. Um zu sehen, es hat nichts mit Ihrer spezifischen Funktion versuchen, zum Beispiel zu tun

>>> np.digitize(np.linspace(0.05,0.95,19), np.linspace(0,1,11)) 
array([ 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 
    10, 10]) 

oder direkt

>>> np.linspace(0.05,0.95,19) == np.linspace(0,1,21)[1:-1] 
array([ True, True, False, True, True, False, False, False, False, 
    False, False, False, True, False, True, False, False, True, False], dtype=bool)                

Wenn Sie ganze Zahlen genaue Grenzen müssen verwenden, wenn möglich. Wenn nicht, gibt es das Fraktionsmodul. Nicht sicher, wie gut es mit numpy spielt, obwohl. Sicherlich wird nicht schnell sein.

+0

Interessant und nervig! Es wurde versucht, die Funktion fructile() auf eine akzeptable Genauigkeit zu runden, aber nicht ideal. Bearbeitete Frage zum Nachdenken. – user2579685

Verwandte Themen