После некоторой обработки массива аудио или изображений его необходимо нормализовать в пределах диапазона, прежде чем он сможет быть записан обратно в файл. Сделать это можно так:
# 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)
Есть ли способ сделать это менее подробным и удобным способом? matplotlib.colors.Normalize()
похоже, не связано.
Если массив содержит как положительные, так и отрицательные данные, я бы пошел с:
Если массив содержит
nan
, одним из решений может быть просто удалить их как:Однако в зависимости от контекста вы можете относиться к нему по-
nan
разному. Например, интерполируйте значение, заменив, например, на 0, или вызовите ошибку.Наконец, стоит упомянуть, даже если это не вопрос OP, стандартизация :
источник
scipy.stats.zscore
.f = a / np.max(np.abs(a))
... если весь массив не обнуляется (избегайте DivideByZero).numpy.ptp()
возвращает 0, если это диапазон, ноnan
если он естьnan
в массиве. Однако, если диапазон равен 0, нормализация не определена. Это вызывает ошибку, когда мы пытаемся разделить на 0.Вы также можете изменить масштаб, используя
sklearn
. Преимущества состоят в том, что вы можете настроить нормализацию стандартного отклонения в дополнение к центрированию данных по среднему значению, и что вы можете делать это по любой оси, по функциям или по записям.Ключевое слово arguments
axis
,with_mean
,with_std
самообъясняющие и приведены в состояние по умолчанию. Аргументcopy
выполняет операцию на месте, если для него установлено значениеFalse
. Документация здесь .источник
Вы можете использовать версию "i" (как в idiv, imul ..), и это выглядит неплохо:
В другом случае вы можете написать функцию для нормализации n-мерного массива по столбцам:
источник
/=
вместо= .. / ..
Вы пытаетесь масштабировать min-max значения от
audio
-1 до +1 иimage
от 0 до 255.Использование
sklearn.preprocessing.minmax_scale
, должно легко решить вашу проблему.например:
и
Примечание : не путать с операцией, которая масштабирует норму (длину) вектора до определенного значения (обычно 1), что также обычно называется нормализацией.
источник
Простое решение - использовать средства масштабирования, предлагаемые библиотекой sklearn.preprocessing.
Ошибка X_rec-X будет равна нулю. Вы можете настроить feature_range под свои нужды или даже использовать стандартный скейлер sk.StandardScaler ()
источник
Я попытался выполнить это и получил ошибку
numpy
Массив , который я пытался нормализуют былinteger
массив. Кажется, они устарели с приведением типов в версиях>1.10
, и вы должны использовать этоnumpy.true_divide()
для решения этой проблемы.img
былPIL.Image
объектом.источник