如何在Numpy中无需循环将mask数组的单个1替换为target向量
Numpy无循环实现mask指定位置填充target向量
方案1:支持重叠场景(符合需求,后填充覆盖前填充)
无需显式for循环,完美适配你给出的重叠场景逻辑,实现代码如下:
import numpy as np L = len(target) # 提取mask中所有值为1的索引 ones_idx = np.where(mask == 1)[0] # 广播生成所有需要赋值的位置索引 fill_pos = ones_idx[:, np.newaxis] + np.arange(L) # 生成对应位置的取值 fill_val = np.tile(target, (len(ones_idx), 1)) # 初始化输出数组 output = np.zeros_like(mask) # 批量赋值,重复索引位置后赋值的会自动覆盖先赋值的 output[fill_pos] = fill_val
方案2:无重叠场景高效实现
如果可以保证mask中两个1的间隔大于等于target长度(无重叠),可以用卷积实现,内存和速度效率更高:
# target反转后和mask做卷积,取前len(mask)个元素即可 output = np.convolve(mask, target[::-1], mode="full")[:len(mask)]
效果验证
用你给出的重叠场景示例测试:
target = np.array([5, 4, 3, 2, 1]) mask = np.array([0, 0, 1, 0, 0, 0, 1, 0, 0, 0]) # 用方案1执行 L = len(target) ones_idx = np.where(mask == 1)[0] fill_pos = ones_idx[:, np.newaxis] + np.arange(L) fill_val = np.tile(target, (len(ones_idx), 1)) output = np.zeros_like(mask) output[fill_pos] = fill_val print(output) # 输出:[0 0 5 4 3 2 5 4 3 2],和示例完全一致
内容的提问来源于stack exchange,提问作者fabian789
相关产品推荐
相关产品推荐

