如何无循环实现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
相关产品推荐
相关产品推荐

