Python 标准化使用np.nan填充的3D NumPy阵列

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 我尝试过许多不同的方法,但都没有奏效

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

通过填充np.nan(nan),该矩阵已填充至最大长度170

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

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

我需要通过轴=2对该矩阵进行规范化,通过:

  • 计算第三轴上的平均值,忽略等于np.nan的元素
  • 计算第三轴上的标准偏差,忽略等于np.nan的元素
  • 减去不等于np.nan的每个元素的平均值
  • 除以标准偏差,每个元素不等于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进行减法和除法,忽略填充值吗

    多谢各位

    数据是通过本笔记本生成的(请注意,回购协议正在开发中!):


    我已上传数据(酸洗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数据,如果你想用它做实验,谢谢!这似乎对索斯兰有效!让我检查一下,我会回来确认的。谢谢这个解决方案对你有效吗,还是有其他问题?