【问题标题】:Standarize a 3D NumPy array that has been padded with np.nan标准化已用 np.nan 填充的 3D NumPy 数组
【发布时间】:2019-12-03 02:06:44
【问题描述】:

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

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

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

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

我需要通过axis=2对这个矩阵进行归一化,方法是:

  1. 计算第 3 轴上的平均值,忽略等于 np.nan 的元素
  2. 在第 3 轴上计算 std dev,忽略等于 np.nan 的元素
  3. 对每个不等于 np.nan 的元素减去均值
  4. 每个不等于 np.nan 的元素除以 std dev

我尝试了许多不同的方法,但都没有奏效。其他帖子指向使用 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 进行减法和除法运算,省略填充值?

非常感谢!

数据是用这个 notebook 生成的(注意 repo 正在开发中!):Urban sound classification with CNN

我已经上传了数据(腌制的 X 和 y):MFCC Coeffs X and Y

【问题讨论】:

  • 你所有的值几乎都是一样的,难怪stddev是零。随机 3D 张量也会发生同样的事情吗?
  • 很可能是由于值通常彼此非常接近,而mean - element 趋向于数值精度。对于stddev,您进一步将该值除以元素数,然后从中取出sqrt,它低于该阈值。您应该将计算出的平均值与值进行比较,看看减法后还剩下多少。如果mean 足够接近零,只需输入零。这个数据到底是什么,看起来很奇怪
  • @SzymonMaszke 这是来自音频样本的 MFCC 系数。使用填充是因为所有音频文件都具有不同的持续时间。关于如何规范化 MFCC 有许多不同的理论,甚至很多人认为规范化 MFCC 有时并不是真正需要的。但我想做自己的实验,看看相同的模式架构如何处理标准和规范化数据,训练相同数量的 epoch。
  • @SzymonMaszke 当然!让我回家,我会准备一个笔记本和一些保存的数据,谢谢你的帮助!
  • @SzymonMaszke 再次嗨,我刚刚用笔记本和泡菜数据更新了帖子,如果你想尝试一下,谢谢!

标签: python numpy normalize mfcc


【解决方案1】:

请试试这个解决方案:

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 修复这种情况。

【讨论】:

  • 这似乎工作@Soslan!让我检查一下,我会回来确认。谢谢!
  • 该解决方案是否适合您,或者还有其他问题?
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2016-12-13
  • 2021-08-29
  • 2018-05-07
相关资源
最近更新 更多