我正在尝试对矩阵进行一些数学运算,可以将其写下来,但不确定如何编写代码。这涉及到获取一列行边际值,然后创建一个新矩阵,该矩阵将所有非零行值替换为边际,之后,我想将非零新值的总和除以列边际。
我可以排到行的边缘,但是我似乎想不出一种重新填充的方法。
我想要的例子
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]])
答案 0 :(得分: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 ]])