如何将矩阵A的每行快速加到矩阵C的指定行?(Numpy优化方案)
高效实现按索引累加的Numpy方案
原Python循环的核心逻辑是:将矩阵A的每一行,根据index数组对应的索引值,累加到矩阵C的对应行中。以下是两种基于Numpy的高效实现方式:
方法一:使用np.add.at(完美匹配原逻辑)
np.add.at是Numpy专门用于原地索引累加的函数,直接对应原循环的操作逻辑,且完全基于向量化实现,效率远高于Python循环。
代码示例:
import numpy as np # 假设已初始化C(d*m), index(n), A(n*m) np.add.at(C, index, A)
说明
- 该操作会直接在
C的指定索引行上累加A的对应行,无需手动遍历; - 支持
C已有初始值的场景,完全复刻原循环的“累加”行为; - 底层由C语言实现,处理大规模数据时速度提升显著。
方法二:分组求和优化(适用于C初始为全零的场景)
如果C初始是全零矩阵,可以先对A按index分组求和,再赋值给C,这种方式在n远大于d时性能更优。
代码示例:
import numpy as np # 初始化分组求和矩阵 group_sums = np.zeros_like(C) np.add.at(group_sums, index, A) # 若C已有初始值则累加,否则直接赋值 C += group_sums
补充:另一种分组求和方式(适合小维度m)
当m较小时,也可以用布尔索引分组求和,但性能略逊于np.add.at:
for i in range(d): C[i] += A[index == i].sum(axis=0)
性能对比
Python循环的时间复杂度为O(nm),但由于是Python层面的逐元素遍历,常数开销极大;而Numpy的向量化操作同样是O(nm)复杂度,但底层由C执行,常数开销极小,对于n、m较大的场景,速度可提升几十至上百倍。
内容的提问来源于stack exchange,提问作者Chenming Zhang
相关产品推荐
相关产品推荐

