标准化一个用 np.nan 填充的 3D NumPy 数组
Standarize a 3D NumPy array that has been padded with np.nan
我有一个形状像 (100, 40, 170) 的 3D 矩阵。
此矩阵已填充 np.nan (NaN),达到最大长度 170。
矩阵中的值表示使用 LibRosa (Python) 从 UrbanSound8K dataset 中提取的音频数据的 MFCC 系数。
(源笔记本和数据共享,查看post结尾)
我需要通过 axis=2 对这个矩阵进行归一化,方法是:
- 计算第 3 个轴的平均值,忽略等于 np.nan
的元素
- 计算第 3 个轴上的标准偏差,忽略等于 np.nan
的元素
- 对每个不等于np.nan
的元素减去均值
- 除以 std dev 每个不等于 np.nan
的元素
我尝试了很多不同的方法,但都没有奏效。其他 posts 指向 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 进行减法和除法而忽略填充值吗?
非常感谢!
数据是用这个笔记本生成的(注意回购正在开发中!):Urban sound classification with CNN
我已经上传了数据(腌制的X和y):MFCC Coeffs X and Y
请尝试这个解决方案:
X_norm = np.where(np.isnan(X_nan), np.nan, X_nan - mean)
X_norm = np.where(X_norm == 0, 0, X_norm/std)
也给出警告,但看起来工作正常。
std 只有在所有元素都相同时才能为 0,但在这种情况下,平均值等于元素,减法后您将获得所有零。所以第二个 np.where 解决这个问题。
我有一个形状像 (100, 40, 170) 的 3D 矩阵。
此矩阵已填充 np.nan (NaN),达到最大长度 170。
矩阵中的值表示使用 LibRosa (Python) 从 UrbanSound8K dataset 中提取的音频数据的 MFCC 系数。
(源笔记本和数据共享,查看post结尾)
我需要通过 axis=2 对这个矩阵进行归一化,方法是:
- 计算第 3 个轴的平均值,忽略等于 np.nan 的元素
- 计算第 3 个轴上的标准偏差,忽略等于 np.nan 的元素
- 对每个不等于np.nan 的元素减去均值
- 除以 std dev 每个不等于 np.nan 的元素
我尝试了很多不同的方法,但都没有奏效。其他 posts 指向 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 进行减法和除法而忽略填充值吗?
非常感谢!
数据是用这个笔记本生成的(注意回购正在开发中!):Urban sound classification with CNN
我已经上传了数据(腌制的X和y):MFCC Coeffs X and Y
请尝试这个解决方案:
X_norm = np.where(np.isnan(X_nan), np.nan, X_nan - mean)
X_norm = np.where(X_norm == 0, 0, X_norm/std)
也给出警告,但看起来工作正常。
std 只有在所有元素都相同时才能为 0,但在这种情况下,平均值等于元素,减法后您将获得所有零。所以第二个 np.where 解决这个问题。