You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将矩阵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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:22:34