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
相关产品推荐
相关产品推荐

