Después de realizar un procesamiento en una matriz de audio o imagen, debe normalizarse dentro de un rango antes de poder volver a escribirse en un archivo. Esto se puede hacer así:
# 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)
¿Hay una manera menos verbosa y conveniente de hacer esto? matplotlib.colors.Normalize()
no parece estar relacionado
Si la matriz contiene datos positivos y negativos, iría con:
Si la matriz contiene
nan
, una solución podría ser simplemente eliminarlos como:Sin embargo, dependiendo del contexto, es posible que desee tratar de manera
nan
diferente. Por ejemplo, interpolar el valor, reemplazarlo con, por ejemplo, 0, o generar un error.Finalmente, vale la pena mencionar incluso si no es la pregunta de OP, la estandarización :
fuente
scipy.stats.zscore
.f = a / np.max(np.abs(a))
... a menos que toda la matriz tenga ceros (evite DivideByZero).numpy.ptp()
devuelve 0, si ese es el rango, peronan
si hay unonan
en la matriz. Sin embargo, si el rango es 0, la normalización no está definida. Esto genera un error cuando intentamos dividir con 0.También puede reescalar usando
sklearn
. Las ventajas son que puede ajustar, normalizar la desviación estándar, además de centrar la media de los datos, y que puede hacerlo en cualquier eje, por características o por registros.Tales argumentos
axis
,with_mean
,with_std
son explica por sí mismo, y se muestran en su estado predeterminado. El argumentocopy
realiza la operación in situ si está establecido enFalse
. Documentación aquí .fuente
Puede usar la versión "i" (como en idiv, imul ..), y no se ve nada mal:
Para el otro caso, puede escribir una función para normalizar una matriz n-dimensional por columnas:
fuente
/=
lugar de= .. / ..
Está intentando escalar min-max los valores
audio
entre -1 y +1 yimage
entre 0 y 255.Usando
sklearn.preprocessing.minmax_scale
, debería resolver fácilmente su problema.p.ej:
y
nota : No debe confundirse con la operación que escala la norma (longitud) de un vector a un cierto valor (generalmente 1), que también se conoce comúnmente como normalización.
fuente
Una solución simple es usar los escaladores que ofrece la biblioteca sklearn.preprocessing.
El error X_rec-X será cero. Puede ajustar el feature_range para sus necesidades, o incluso usar un escalador estándar sk.StandardScaler ()
fuente
Intenté seguir esto y obtuve el error
La
numpy
matriz que estaba tratando de normalizar era unainteger
matriz. Parece que desaprobaron la conversión de tipos en las versiones>1.10
, y tienes que usarnumpy.true_divide()
para resolver eso.img
Fue unPIL.Image
objeto.fuente