如何无循环地根据索引数组将Numpy数组指定通道置零?
解决方案
要实现无循环地将每个样本对应通道置零,关键是构造匹配维度的高级索引,让每个样本仅对应自己的目标通道:
核心代码
import numpy as np # 初始化数组 arr = np.random.randint(255, size=(100,64,64,16)) ind = np.random.randint(16, size=(100,2)) # 构造样本索引:将(100,)的数组扩展为(100,2),和ind的维度匹配 sample_indices = np.arange(100)[:, None] # 高级索引置零 arr[sample_indices, :, :, ind] = 0
为什么之前的方法出错?
你尝试的arr[:,:,:,ind] = 0会触发Numpy的广播机制:ind的形状是(100,2),而前三个维度是(100,64,64),广播后会把每个样本的所有位置都对应ind中所有100×2个通道,最终导致整个数组被置零。
验证方法
可以随机选一个样本,检查它的目标通道是否全零:
# 取第0个样本的目标通道 sample_idx = 0 target_channels = ind[sample_idx] print(f"第{sample_idx}个样本的目标通道{target_channels}是否全零:") print(np.all(arr[sample_idx, :, :, target_channels] == 0))
内容的提问来源于stack exchange,提问作者nOOb99
相关产品推荐
相关产品推荐

