2014-09-11 14 views
5

Grundsätzlich habe ich ein Array, das zwischen zwei beliebigen Zahlen variieren kann, und ich möchte die Verteilung erhalten, während es auf den [0,1] Raum beschränkt wird. Die Funktion ist sehr einfach. Normalerweise schreibe ich es als:NumPy-Array von 0 und 1 begrenzt?

def to01(array): 
    array -= array.min() 
    array /= array.max() 
    return array 

Natürlich kann es und komplexer sein sollte für jede Menge Situationen Rechnung zu tragen, wie alle Werte gleich (Division durch Null) zu sein und schwimmen gegen Integer-Division (Verwendung npsubtract und np.divide anstelle von Operatoren). Aber das ist das grundlegendste.

Das Problem ist, dass ich dies sehr häufig über Sachen in meinem Projekt mache, und es scheint wie eine ziemlich standardmäßige mathematische Operation. Gibt es eine eingebaute Funktion, die das in NumPy macht?

+0

Ich bin ein wenig verwirrt, denn wenn man ein Array von ints zwischen 0 und 1 normalisiert werden Sie nur eine Reihe von Nullen und ein. Das bedeutet, dass Sie viele Vertriebsinformationen verlieren werden. – BKay

+0

hast du durch die Dokumente geschaut? – wwii

+1

@ user3557216 das sieht ziemlich effizient aus, aber ich würde 'array' in einen anderen Namen ändern, um die' np.array() '-Funktion nicht zu überschatten ... –

Antwort

1

Ich weiß nicht, ob da ein eingebauter ist (wahrscheinlich nicht, es ist nicht wirklich eine schwierige Sache zu tun, wie es ist). Sie können vectorize verwenden, um eine Funktion auf alle Elemente des Arrays gelten:

def to01(array): 
    a = array.min() 
    # ignore the Runtime Warning 
    with numpy.errstate(divide='ignore'): 
     b = 1. /(array.max() - array.min()) 
    if not(numpy.isfinite(b)): 
     b = 0 
    return numpy.vectorize(lambda x: b * (x - a))(array) 
+0

Ja, ich habe eine Funktion, dies zu tun. Es ist ein bisschen Nische, und vielleicht mehr die Verantwortung des Colormappers als des Datensammlers, also denke ich, dass dies genügen wird. – user3557216