如果B [i,j] == 1,则从A生成包含每个列A行平均值的新矩阵,其中B是邻接矩阵

时间:2020-07-17 13:43:42

标签: python numpy matrix mean adjacency-matrix

如果B [i,j] == 1,我们如何获得一个包含每一行A行平均值的新矩阵?

假设我们有一个矩阵A(3,4)和一个矩阵B(3,3)

A =  [1      2     3      4
      15     20    7      10 
      0      5     18     12]

还有一个邻接矩阵

 B = [1    0     1   
      0    0     1    
      1    1     1 ]  

期望的输出矩阵C,它采用B中相连像素的平均值:

例如[(1+0)/2 (2+5)/2 (3+18)/2 (4+12)/2],因此我们在第一行中得到[0.5 , 3.5 10.5 8]

           C =[0.5     3.5   10.5   8
               0        5     18   12
               5.33    9      9.33   8.66]

要找到每个i的邻域,我实现了以下代码:

for i in range(A.shape[0]):
    for j in range(A.shape[0]):
        if (B[i,j] == 1):
            print(j)

2 个答案:

答案 0 :(得分:1)

您可以通过矩阵乘法来形成所需的总和:

>>> A = np.array([[1, 2, 3, 4], [15, 20, 7, 10], [0, 5, 18, 12]])
>>> B = np.array([[1, 0, 1], [0, 0, 1], [1, 1, 1]])

>>> summed_groups = B@A
>>> summed_groups
array([[ 1,  7, 21, 16],
       [ 0,  5, 18, 12],
       [16, 27, 28, 26]])

要获取均值,请按每组的术语数进行标准化:

>>> group_sizes = B.sum(axis=1,keepdims=True)
>>> group_sizes
array([[2],
       [1],
       [3]])

>>> summed_groups / group_sizes
array([[ 0.5       ,  3.5       , 10.5       ,  8.        ],
       [ 0.        ,  5.        , 18.        , 12.        ],
       [ 5.33333333,  9.        ,  9.33333333,  8.66666667]])

侧面说明:您还可以通过矩阵乘法来获取组大小:

>>> group_sizes_alt = B@np.ones((len(A),1))
>>> group_sizes_alt
array([[2.],
       [1.],
       [3.]])

答案 1 :(得分:0)

使用布尔索引很方便。例如,

>>> A[[True, False, True], :]

array([[ 1,  2,  3,  4],
       [ 0,  5, 18, 12]])

这将选择A矩阵的第0行和第2行。您可以遍历B的列并构造C矩阵:

A = np.array([[1, 2, 3, 4], [15, 20, 7, 10], [0, 5, 18, 12]])
B = np.array([[1, 0, 1], [0, 0, 1], [1, 1, 1]]).astype(bool)
C = np.array([A[B[:, i], :].mean(axis=0) for i in range(A.shape[0])])
print(np.around(C, 2))

结果:

[[ 0.5   3.5  10.5   8.  ]
 [ 0.    5.   18.   12.  ]
 [ 5.33  9.    9.33  8.67]]