gpt4 book ai didi

python - numpy 按索引求和矩阵行

转载 作者:太空狗 更新时间:2023-10-30 00:09:08 26 4
gpt4 key购买 nike

我有 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.]])

最佳答案

我们可以简单地在 B 的转置 View 上使用 np.add.at -

np.add.at(B.T, b, A[a])

sample 运行-

In [39]: 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)
...: A = np.zeros((4,7),dtype=int)
...: A[a,:] = np.array([[0, 1, 2, 3, 4, 5, 6],
...: [3, 3, 3, 3, 3, 3, 3],
...: [3, 3, 3, 3, 3, 3, 3]])

In [40]: # Initialize B
...: B = np.zeros((7,5),dtype=int)

In [41]: np.add.at(B.T, b, A[a])

In [42]: B
Out[42]:
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]])

作为commented by @DSM ,我们还可以使用矩阵乘法,从而避免为 C==1 -

获取索引的步骤
A.T.dot(C==1)

关于python - numpy 按索引求和矩阵行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50157754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com