【问题标题】:Replacing non zero values in a matrix with the marginals用边际替换矩阵中的非零值
【发布时间】:2019-05-27 10:34:36
【问题描述】:

我正在尝试用我的矩阵做一些数学运算,我可以把它写下来,但我不知道如何编码。这涉及获取一列行边际值,然后制作一个新矩阵,其中所有非零行值都替换为边际,之后我想将非零新值的总和除以列边际。

我可以到达行边缘,但我似乎想不出一种重新填充的方法。

我想要的例子

import numpy as np

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

matrix([[1, 3, 0],
        [0, 1, 2],
        [1, 0, 4]])

marginals = ((matrix != 0).sum(1) / matrix.sum(1))

matrix([[0.5       ],
        [0.66666667],
        [0.4       ]])

接下来我要做的是根据第一个的非零位置填充矩阵。


matrix([[0.5, 0.5, 0],
        [0, 0.667, 0.667],
        [0.4, 0, 0.4]])

最终想要的结果是新矩阵列总和除以该列中非零出现的次数。


matrix([[(0.5+0.4)/2, (0.5+0.667)/2, (0.667+0.4)/2]])

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    为了获得最终的矩阵,我们可以使用matrix-multiplication 来提高效率 -

    In [84]: mask = matrix!=0
    
    In [100]: (mask.T*marginals).T/mask.sum(0)
    Out[100]: matrix([[0.45      , 0.58333334, 0.53333334]])
    

    或者更简单-

    In [110]: (marginals.T*mask)/mask.sum(0)
    Out[110]: matrix([[0.45      , 0.58333334, 0.53333334]])
    

    如果您也需要中间 填充 输出,请使用 np.multiply 进行广播元素乘法 -

    In [88]: np.multiply(mask,marginals)
    Out[88]: 
    matrix([[0.5       , 0.5       , 0.        ],
            [0.        , 0.66666667, 0.66666667],
            [0.4       , 0.        , 0.4       ]])
    

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多