如果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)
答案 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]]