Wie normaliere ich ein NumPy-Array in einem bestimmten Bereich?

Nach einer Bearbeitung auf einem Audio- oder Bild-Array muss es innerhalb eines Bereichs normalisiert werden, bevor er in eine Datei geschrieben werden kann. Das kann man so machen:

# Normalize audio channels to between -1.0 and +1.0 audio[:,0] = audio[:,0]/abs(audio[:,0]).max() audio[:,1] = audio[:,1]/abs(audio[:,1]).max() # Normalize image to between 0 and 255 image = image/(image.max()/255.0) 

Gibt es eine weniger verbose, Bequemlichkeit Funktion Weg, dies zu tun? matplotlib.colors.Normalize() scheint nicht verwandt zu sein.

4 Solutions collect form web for “Wie normaliere ich ein NumPy-Array in einem bestimmten Bereich?”

 audio /= np.max(np.abs(audio),axis=0) image *= (255.0/image.max()) 

Mit /= und *= können Sie ein temporäres temporäres Array eliminieren und so etwas Speicher sparen. Multiplikation ist weniger teuer als Division, also

 image *= 255.0/image.max() # Uses 1 division and image.size multiplications 

Ist marginal schneller als

 image /= image.max()/255.0 # Uses 1+image.size divisions 

Da wir hier grundlegende numpy Methoden verwenden, denke ich, das ist ungefähr so ​​effizient eine Lösung in numpy wie es sein kann.

Sie können auch mit sklearn . Die Vorteile sind, dass Sie die Standardabweichung normalisieren können, zusätzlich zu den Mittelwerten der Daten, und dass Sie dies auf jeder Achse, nach Features oder durch Datensätze tun können.

 from sklearn.preprocessing import scale X = scale( X, axis=0, with_mean=True, with_std=True, copy=True ) 

Die Keyword-Argumente axis , with_mean , with_std sind selbsterklärend und werden in ihrem Standardzustand angezeigt. Die Argumentkopie führt die Operation an Ort und Stelle aus, wenn sie auf False . Dokumentation hier

Sie können die "i" (wie in idiv, imul ..) Version verwenden, und es sieht nicht halb schlecht aus:

 image /= (image.max()/255.0) 

Für den anderen Fall können Sie eine Funktion schreiben, um ein n-dimensionales Array durch Spalten zu normalisieren:

 def normalize_columns(arr): rows, cols = arr.shape for col in xrange(cols): arr[:,col] /= abs(arr[:,col]).max() 

Wenn das Array sowohl positive als auch negative Daten enthält, würde ich mit:

 import numpy as np a = np.random.rand(3,2) # Normalise over all dimensions # Normalised [0,1] b = (a - np.max(a))/-np.ptp(a) # Normalised [0,255] as integer c = (255*(a - np.max(a))/-np.ptp(a)).astype(int) # Normalised [-1,1] d = 2*(a - np.max(a))/-np.ptp(a)-1 

Auch erwähnenswert, auch wenn es nicht die Frage der OP ist, Standardisierung :

 e = (a - np.mean(a)) / np.std(a) 
  • Pearson's Chi Square Test Python
  • Wie kann man Standardfehler aus ODR-Ergebnissen berechnen?
  • Anpassen von Daten an Verteilungen?
  • Minimieren von Funktionen mit großen Gradienten mit `scipy.optimize.minimize`
  • Spärliche 3d Matrix / Array in Python?
  • Wie komme ich zurück, grad als Tupel für scipys fmin_cg Funktion
  • Strategie zur Isolierung von 3D-Datenpunkten
  • Wie bekomme ich Wärmemap mit Text in Matplotlib?
  • Numpy / Scipy Broadcast Berechnung Skalar Produkt für ein bestimmtes Element
  • Input / Output-Fehler in scipy.optimize.fsolve
  • Scipys griddata-Methode scheitert immer
  • Python ist die beste Programmiersprache der Welt.