Python 标准化使用np.nan填充的3D NumPy阵列
我有一个形状像(100,40,170)的3D矩阵 通过填充np.nan(nan),该矩阵已填充至最大长度170 矩阵中的值表示使用LibRosa(Python)从中提取的音频数据的MFCC系数 (源笔记本和数据共享,请检查帖子末尾) 我需要通过轴=2对该矩阵进行规范化,通过:Python 标准化使用np.nan填充的3D NumPy阵列,python,numpy,normalize,mfcc,Python,Numpy,Normalize,Mfcc,我有一个形状像(100,40,170)的3D矩阵 通过填充np.nan(nan),该矩阵已填充至最大长度170 矩阵中的值表示使用LibRosa(Python)从中提取的音频数据的MFCC系数 (源笔记本和数据共享,请检查帖子末尾) 我需要通过轴=2对该矩阵进行规范化,通过: 计算第三轴上的平均值,忽略等于np.nan的元素 计算第三轴上的标准偏差,忽略等于np.nan的元素 减去不等于np.nan的每个元素的平均值 除以标准偏差,每个元素不等于np.nan 我尝试过许多不同的方法,但都没有奏效
# 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进行减法和除法,忽略填充值吗
多谢各位
数据是通过本笔记本生成的(请注意,回购协议正在开发中!):
我已上传数据(酸洗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.where可以解决这种情况。所有的值几乎相同,难怪
stddev
为零。随机三维张量也会发生同样的情况吗?最可能的原因是数值通常非常接近,并且平均元素趋于数值精度。对于stddev
,您进一步将该值除以元素数,并从中获取sqrt
,该值低于该阈值。您应该将计算的平均值与值进行比较,看看减法后剩下多少。如果平均值
足够接近零,只需输入零。这些数据是什么,看起来很漂亮strange@SzymonMaszke这是来自音频样本的MFCC系数。使用Padded是因为所有音频文件的持续时间都不同。关于如何规范化MFCC有许多不同的理论,许多理论甚至告诉我们,有时候,规范化MFCC并不是必需的。但是我想做我自己的实验,看看同样的模式架构如何处理标准化和规范化的数据,为同样数量的时代进行训练。@SzymonMaszke当然!让我回家,我会准备一个笔记本和一些保存的数据,谢谢你的帮助@SzymonMaszke你好,我刚刚更新了一个笔记本和pickle数据,如果你想用它做实验,谢谢!这似乎对索斯兰有效!让我检查一下,我会回来确认的。谢谢这个解决方案对你有效吗,还是有其他问题?