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

Python广播实现:用一维向量作为二维数组某维度索引赋值

实现指定列索引的广播累加操作

这个需求本质是给二维数组的每一行,根据对应的列索引,批量累加同一个标量值,我们可以从基础遍历和向量化操作两个层面来实现:

基础遍历实现(通用伪代码/原生Python)

如果是用原生列表或者其他不支持高级索引的语言,核心思路就是逐行匹配列索引,逐个更新元素:

伪代码逻辑

function f(table, col_indices, vals, i):
    // 取出要累加的目标值
    current_val = vals[i]
    // 遍历每一行的索引
    for row_idx from 0 to len(table)-1:
        // 获取当前行需要更新的列索引
        target_col = col_indices[row_idx]
        // 累加操作
        table[row_idx][target_col] += current_val

原生Python示例

用你给出的测试数据验证:

def broadcast_add(table, col_indices, vals, i):
    current_val = vals[i]
    # 用enumerate同时获取行索引和对应的列索引
    for row_idx, col_idx in enumerate(col_indices):
        table[row_idx][col_idx] += current_val

# 测试用例
t = [[0,0,0], [0,0,0], [0,0,0]]
c = [0, 1, 2]
v = [1, 10, 1000]
i = 1

broadcast_add(t, c, v, i)
print(t)  # 输出: [[10, 0, 0], [0, 10, 0], [0, 0, 10]]

这个方法逻辑直观,适合小数据量或者需要兼容多种语言的场景。

向量化实现(NumPy,适合大数据量)

如果用Python的NumPy库处理数组,利用它的高级索引可以实现更高效的向量化操作,避免循环:

import numpy as np

# 转换为NumPy数组
t_np = np.array([[0,0,0], [0,0,0], [0,0,0]])
c_np = np.array([0, 1, 2])
v_np = np.array([1, 10, 1000])
i = 1

# 利用行索引数组和列索引数组配对定位,直接累加
t_np[np.arange(t_np.shape[0]), c_np] += v_np[i]

print(t_np)
# 输出结果:
# [[  10    0    0]
#  [   0   10    0]
#  [   0    0   10]]

这里np.arange(t_np.shape[0])生成了和行数一致的行索引数组[0,1,2],和c_np的列索引数组一一对应,直接定位到所有需要更新的元素位置,一次性完成累加,效率比循环高很多,适合处理大规模数组。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:39