【问题标题】:Normalize Numpy matrix rows by their average按平均值对 Numpy 矩阵行进行归一化
【发布时间】:2015-10-20 02:57:32
【问题描述】:

我想用它们的平均值对矩阵行进行归一化,我为此编写了这段代码

m = np.matrix(
    [[1,2,3,4,5],
     [2,3,2,5,3],
     [5,5,5,3,2]])

for row in m[:,]:
    average = row.sum() / row.shape[1]
    row = row / average

在循环中,我将行除以平均值。但是这种划分不会改变矩阵 m。我怎样才能以最简单、最聪明的方式实现这种规范化?

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    计算逐行平均值,然后计算m/average

    In [36]: average = m.mean(axis=1)
    
    In [37]: average
    Out[37]: 
    matrix([[ 3.],
            [ 3.],
            [ 4.]])
    
    In [38]: m/average
    Out[38]: 
    matrix([[ 0.33333333,  0.66666667,  1.        ,  1.33333333,  1.66666667],
            [ 0.66666667,  1.        ,  0.66666667,  1.66666667,  1.        ],
            [ 1.25      ,  1.25      ,  1.25      ,  0.75      ,  0.5       ]])
    

    请注意,如果您的矩阵包含 NaN 值,那么您可以使用 np.nanmean(m, axis=1) 而不是 m.mean(axis=1) 来计算逐行均值,同时忽略 NaN。

    【讨论】:

    • m /= m.mean(axis=1) 来修改m,但考虑到m 的dtype 是int,它们最终会是整数而不是浮点数。
    【解决方案2】:

    对于m 中的in-situ 更改,您可以转换为float 数据类型(如果还没有),然后使用np.divide,就像这样-

    m = m.astype(float)
    np.divide(m,m.mean(1),m)
    

    示例运行 -

    In [294]: m
    Out[294]: 
    matrix([[1, 2, 3, 4, 5],
            [2, 3, 2, 5, 3],
            [5, 5, 5, 3, 2]])
    
    In [295]: m = m.astype(float)
    
    In [296]: np.divide(m,m.mean(1),m);
    
    In [297]: m
    Out[297]: 
    matrix([[ 0.33333333,  0.66666667,  1.        ,  1.33333333,  1.66666667],
            [ 0.66666667,  1.        ,  0.66666667,  1.66666667,  1.        ],
            [ 1.25      ,  1.25      ,  1.25      ,  0.75      ,  0.5       ]])
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2021-07-24
      • 2022-11-29
      相关资源
      最近更新 更多