У меня есть 3D-матрица формы (100, 40, 170).
Эта матрица была дополнена для достижения максимальной длины 170 путем заполнения np.nan (NaN).
Значения в матрице представляют собой коэффициенты MFCC из аудиоданных, извлеченных из набора данных UrbanSound8K с использованием LibRosa ( Питон).
(Исходный блокнот и данные являются общими, проверьте конец сообщения)
Мне нужно нормализовать эту матрицу по оси = 2:
- Вычислите среднее значение по 3-й оси, игнорируя элементы, равные np.nan
- Вычислить стандартное отклонение по 3-й оси, игнорируя элементы, равные np.nan
- Вычтите среднее значение для каждого элемента, который не равен np.nan
- Разделите на std dev каждый элемент, который не равен np.nan
Я пробовал много разных способов и не работал. Другие сообщения указывают на использование sklearn, но инструменты нормализации из этой библиотеки не дружат с 3D-матрицами... так что на данный момент это мой лучший подход:
# Compute mean and std dev matrices (omitting NaN and keeping shapes)
mean = np.nanmean(X_nan, axis=2, keepdims=True)
std = np.nanstd(X_nan, axis=2, keepdims=True)
Но затем, когда я вычитаю и делю, я получаю ошибки:
X_norm -= mean
X_norm /= std
В предупреждающем сообщении говорится:
RuntimeWarning: divide by zero encountered in true_divide
И когда я проверяю только первые элементы нормализованной и исходной матриц, я вижу:
# Original
array([[[-58.95327, -58.95327, -58.95327, ...,
nan, nan, nan],
# Normalized
array([[[-inf, -inf, -inf, ...,
inf, inf, inf],
Обратите внимание, что значения -inf вводятся при вычитании среднего, а не при делении.
Можете ли вы порекомендовать мне способ вычисления обеих метрик и выполнения вычитания и деления с помощью NumPy, опуская дополненные значения?
Большое спасибо!
Данные были созданы с помощью этого блокнота (обратите внимание, что репозиторий находится в разработке!): Классификация городских звуков с помощью CNN
Я загрузил данные (выделенные X и Y): Коэффициенты MFCC X и Y
stddev
равно нулю. Происходит ли то же самое со случайным трехмерным тензором? - person Szymon Maszke   schedule 25.07.2019np.inf
? И вы уверены, что это происходит после вычитания среднего? - person Szymon Maszke   schedule 25.07.2019mean - element
приближаются к числовой точности. Дляstddev
вы далее делите это значение на количество элементов и беретеsqrt
из того, что ниже этого порога. Вы должны сравнить рассчитанное среднее значение со значениями и посмотреть, сколько осталось после вычитания. И еслиmean
достаточно близко к нулю, просто введите ноль. Что это за данные вообще, выглядит довольно странно - person Szymon Maszke   schedule 25.07.2019.npz
или какого-нибудь рассола. - person Szymon Maszke   schedule 25.07.2019