繁体   English   中英

用边际替换矩阵中的非零值

[英]Replacing non zero values in a matrix with the marginals

我正在尝试对矩阵进行一些数学运算,可以将其写下来,但不确定如何编写代码。 这涉及到获取一列行边际值,然后创建一个新矩阵,该矩阵将所有非零行值替换为边际,之后,我想将非零新值的总和除以列边际。

我可以排到排边,但我似乎无法想到重新填充人口的方法。

我想要的例子

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]])

为了获得最终的矩阵,我们可以使用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       ]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM