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



我正在尝试使用矩阵进行一些数学,我可以写下来,但我不确定如何编码。这涉及获取一列行边缘值,然后制作一个新的矩阵,该矩阵的所有非零行值都被边缘替换为边缘,然后我想将非零新值的总和分为列边缘。

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

我想要什么的示例

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

最新更新