非唯一键操作向量化:基于指定行索引生成目标输出向量
实现指定索引赋值的NumPy数组生成
这事儿用NumPy分分钟搞定,给你两种实用的实现方式,根据你的需求选就行:
基础实现(最直观)
先创建一个和test形状完全一致的全0数组,然后直接给指定索引位置赋值,代码如下:
import numpy as np rows = np.array([3, 4]) test = np.array([1, 3, 3, 4, 5]) data = np.array([-1, 2]) # 生成和test同形状的全0数组 output = np.zeros_like(test) # 给rows指定的索引位置赋值对应data的值 output[rows] = data print(output) # 输出结果: [ 0 0 0 -1 2]
逻辑说明
np.zeros_like(test)会生成一个和test维度、数据类型完全匹配的全0数组,保证输出和原始数据形状一致;- 利用NumPy的索引特性,直接用
rows数组作为索引,把data里的对应值批量赋值到output的指定位置; - 未被
rows覆盖的索引位置,保持初始的0值,完全符合你的需求。
进阶场景:处理重复索引(可选)
如果你的rows数组里有重复的索引(比如rows = np.array([3,3])),而你希望重复位置的data值是累加而非覆盖的话,可以用np.add.at来实现:
output = np.zeros_like(test) np.add.at(output, rows, data)
比如rows = [3,3]、data = [-1,2]时,output[3]会是-1 + 2 = 1,而不是被最后一个值覆盖。
核心规则回顾
简单来说,输出数组的第i个元素遵循以下逻辑:
- 如果i是
rows数组里的索引,就取data中对应位置的值; - 反之,该位置保持0值。
内容的提问来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

