标准化已填充 np.nan 的 3D NumPy 数组



我有一个形状为(100,40,170)的3D矩阵。

该矩阵已被填充以通过填充 np.nan (NaN) 来达到 170 的最大长度。

矩阵中的值表示使用 LibRosa (Python) 从 UrbanSound8K 数据集中提取的音频数据中的 MFCC 系数。

(源笔记本和数据共享,查看帖子末尾)

我需要通过以下方式按 axis=2 规范化此矩阵:

  1. 计算第 3 轴上的平均值,忽略等于 np.nan 的元素
  2. 计算第 3 轴上的标准开发,忽略等于 np.nan 的元素
  3. 去每个不等于 np.nan 的元素的平均值
  4. 除以 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 Coeffs X 和 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.哪里解决了这种情况。

相关内容

  • 没有找到相关文章

最新更新