【发布时间】:2018-10-13 22:15:53
【问题描述】:
我有 3 个矩阵(np 数组):
A 的形状为 (n,m) ; B 的形状为 (m,k); C 的形状为 (n,k)
矩阵 C 仅具有来自集合 {-1,0,1} 的值,它是某种“指标”:如果 C[i,j]==1 那么我想添加第 i 行A到b的第j列;如果 C[i,j]==(-1) 然后减去(0 什么都不做)。
它可以很容易地用循环来完成,但我想知道是否有一种可能更快的矢量化方式来完成它?
示例代码:
C = np.array([[-1, 0, 0, 0, 1],
[ 0, 0, 0, 0, -1],
[ 0, 0, 0, 0, -1],
[-1, 0, 0, 1, 1]])
a,b = np.where(C==1)
#here a=[0,3,3] and b=[4,3,4]
A[a,:] = [[0, 1, 2, 3, 4, 5, 6],
[3, 3, 3, 3, 3, 3, 3],
[3, 3, 3, 3, 3, 3, 3]]
B[:,b] += A[a] #B is all 0.0 before
预期结果:
array([[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 4.],
[ 0., 0., 0., 3., 5.],
[ 0., 0., 0., 3., 6.],
[ 0., 0., 0., 3., 7.],
[ 0., 0., 0., 3., 8.],
[ 0., 0., 0., 3., 9.]])
实际结果:
array([[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.],
[ 0., 0., 0., 3., 3.]])
【问题讨论】:
-
之前的A是什么?
-
还有,B之前是什么?
标签: python numpy vectorization