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

如何无循环实现NumPy二维数组指定列对求和并赋值?

问题描述

我有一个2D NumPy数组V,生成代码如下:

import numpy as np
np.random.seed(10)

V = np.random.randint(-10, 10, size=(6,8))

生成的V为:

[[ -1  -6   5 -10   7   6   7  -2]
 [ -1 -10   0  -2  -6   9   6  -6]
 [  5   1   1  -9  -2  -6   4   7]
 [  9   3  -5   3   9   3   2  -9]
 [ -6   8   3   1   0  -1   5   8]
 [  6  -3   1   7   4  -3   1  -9]]

还有两个列索引列表:

r1 = [1, 2, 5]
r2 = [3, 4, 7]

需要将V中r1与r2对应的列对((1,3)、(2,4)、(5,7))求和,结果分别赋值到V的r1对应列。目前通过逐个赋值实现:

V[:, 1] = V[:, [1,3]].sum(axis=1)
V[:, 2] = V[:, [2,4]].sum(axis=1)
V[:, 5] = V[:, [5,7]].sum(axis=1)

得到的目标V为:

[[ -1 -16  12 -10   7   4   7  -2]
 [ -1 -12  -6  -2  -6   3   6  -6]
 [  5  -8  -1  -9  -2   1   4   7]
 [  9   6   4   3   9  -6   2  -9]
 [ -6   9   3   1   0   7   5   8]
 [  6   4   5   7   4 -12   1  -9]]

请问是否存在无需循环的实现方式?

无循环实现方案

可以利用NumPy的向量化操作直接完成,核心思路是一次性提取所有对应列对求和,再批量赋值回r1列:

# 提取r1和r2对应列,按元素位置直接求和
sum_values = V[:, r1] + V[:, r2]
# 批量更新r1对应的列
V[:, r1] = sum_values

验证结果

执行上述代码后,得到的V与手动赋值的结果完全一致:

[[ -1 -16  12 -10   7   4   7  -2]
 [ -1 -12  -6  -2  -6   3   6  -6]
 [  5  -8  -1  -9  -2   1   4   7]
 [  9   6   4   3   9  -6   2  -9]
 [ -6   9   3   1   0   7   5   8]
 [  6   4   5   7   4 -12   1  -9]]

原理说明

  • V[:, r1]和V[:, r2]会分别提取对应索引的列,形成两个形状均为(6,3)的数组;
  • 数组直接相加时,NumPy会按元素对应位置完成求和,正好匹配每一组列对的计算需求;
  • 最后将求和结果批量赋值给V[:, r1],一次性完成所有目标列的更新。

这种方式完全依托NumPy的向量化特性,效率比逐个赋值更高,列对数量越多优势越明显。

内容的提问来源于stack exchange,提问作者EducateMe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:50:33