Python中用给定值与索引列表填充NumPy数组的最简最快方法
已初始化NumPy数组按给定索引批量填充值的最快实现
针对二维零数组按对应索引批量填值的场景,运行速度最快、实现最简洁的方案是使用NumPy内置的二维花式索引做一次性批量赋值,全程在底层C层执行,无Python层循环的额外开销,性能远高于逐点遍历赋值的方案。
索引逻辑拆解
结合输入和目标输出,索引对应关系如下:
- 初始化数组为2行5列,行号范围
[0,1],列号范围[0,4] - 传入的
indices=[(1,2,4),(0,2,4)]格式逻辑为:- 第一个元组对应第0行的填充列位置,顺序与
values一一匹配:列1填第一个值、列2填第二个值、列4填第三个值 - 第二个元组对应第1行的填充列位置,顺序与
values一一匹配:列0填第一个值、列2填第二个值、列4填第三个值
- 第一个元组对应第0行的填充列位置,顺序与
- 最终填充结果为
[[0,a,b,0,c],[a,0,b,0,c]],完全匹配预期。
核心实现代码
前置定义
import numpy as np # 替换为实际业务值 a, b, c = 1, 2, 3 # 初始化目标零数组 M = np.zeros((2, 5)) values = [a, b, c] indices = [(1, 2, 4), (0, 2, 4)]
最快批量赋值实现
# 构造所有填充点的行索引:每行重复len(values)次,匹配每行的填充点数量 row_idx = np.repeat(np.arange(M.shape[0]), len(values)) # 构造所有填充点的列索引:直接拼接两个行对应的列元组 col_idx = np.concatenate(indices) # 构造对应填充值序列:values重复数组行数次,匹配行顺序 assign_values = np.tile(values, M.shape[0]) # 一次性完成全量赋值 M[row_idx, col_idx] = assign_values
方案特点
- 性能最优:所有索引构造、赋值操作均为NumPy底层C实现,无Python循环解释开销,处理百万级元素规模的填充任务时,性能是逐点循环赋值的几十到上百倍
- 适配性强:代码逻辑与输入格式完全对齐,不需要复杂的索引转换,减少人为操作出错概率
- 开销极低:构造临时索引数组的内存占用随填充点数量线性增长,对于常规业务规模的数组,开销可忽略
内容的提问来源于stack exchange,提问作者AJM7564
相关产品推荐
相关产品推荐

