Depois de fazer algum processamento em uma matriz de áudio ou imagem, ele precisa ser normalizado dentro de um intervalo antes de poder ser gravado novamente em um arquivo. Isso pode ser feito da seguinte maneira:
# 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)
Existe uma maneira menos detalhada de função de conveniência para fazer isso? matplotlib.colors.Normalize()
não parece estar relacionado.
Se a matriz contiver dados positivos e negativos, eu usaria:
Se a matriz contiver
nan
, uma solução pode ser removê-las apenas como:No entanto, dependendo do contexto, você pode querer tratar de maneira
nan
diferente. Por exemplo, interpole o valor, substituindo por, por exemplo, 0 ou gere um erro.Por fim, vale a pena mencionar, mesmo que não seja uma pergunta do OP, a padronização :
fonte
scipy.stats.zscore
.f = a / np.max(np.abs(a))
... a menos que toda a matriz seja zerada (evite DivideByZero).numpy.ptp()
retorna 0, se esse for o intervalo, masnan
se houver umnan
na matriz. No entanto, se o intervalo for 0, a normalização não será definida. Isso gera um erro quando tentamos dividir com 0.Você também pode redimensionar usando
sklearn
. As vantagens são que você pode ajustar a normalização do desvio padrão, além de centralizar os dados na média, e fazer isso no eixo, pelos recursos ou pelos registros.Os argumentos de palavra-chave
axis
,with_mean
,with_std
são auto-explicativas, e são mostrados em seu estado padrão. O argumentocopy
executa a operação no local, se estiver definido comoFalse
. Documentação aqui .fonte
Você pode usar a versão "i" (como em idiv, imul ..) e ela não parece nem um pouco ruim:
No outro caso, você pode escrever uma função para normalizar uma matriz n-dimensional por colunas:
fonte
/=
vez de= .. / ..
Você está tentando escalar min-max os valores
audio
entre -1 e +1 eimage
entre 0 e 255.Usando
sklearn.preprocessing.minmax_scale
, deve resolver facilmente o seu problema.por exemplo:
e
Nota : Não deve ser confundida com a operação que dimensiona a norma (comprimento) de um vetor para um determinado valor (geralmente 1), que também é comumente referido como normalização.
fonte
Uma solução simples é usar os dimensionadores oferecidos pela biblioteca sklearn.preprocessing.
O erro X_rec-X será zero. Você pode ajustar o intervalo_funcionalidade para suas necessidades ou até mesmo usar um scaler padrão sk.StandardScaler ()
fonte
Eu tentei seguir isso , e recebi o erro
A
numpy
matriz que eu estava tentando normalizar era umainteger
matriz. Parece que eles preteriram a conversão de tipos nas versões>1.10
, e você precisa usar issonumpy.true_divide()
para resolver isso.img
foi umPIL.Image
objeto.fonte