如何将NumPy二维数组经mask选中的元素与对应一维数组元素相乘,有没有更优雅方案?
NumPy掩码对应元素相乘的更优雅实现
你可以使用np.where实现需求,相比np.select代码更简洁易读,运行效率也更高,是更推荐的方案:
import numpy as np a = np.array([[1,1,1,1],[1,1,1,1]]) mask = np.array([[0,1,0,1],[1,0,1,0]]) b = np.array([2,3,4,5]) # 核心逻辑仅一行 a = np.where(mask, a * b, a) print(a)
运行结果和原实现完全一致:
[[1 3 1 5] [2 1 4 1]]
方案说明
np.where(condition, x, y)会逐元素判断:满足condition的位置返回x的对应元素,否则返回y的对应元素,完美匹配双分支的替换需求,np.select更适合多条件分支的复杂场景- 这里利用了NumPy的广播特性:形状为
(m,n)的a和形状为(n,)的b相乘时,b会自动扩展为(m,n)的形状,每一行都和原b一致,刚好对应每一列的乘数规则
其他可选方案
如果你需要原地修改数组,不想生成新的数组对象,可以用布尔索引直接赋值:
mask = mask.astype(bool) a[mask] = (a * b)[mask]
如果处理的是超大数组,想避免对全数组做乘法减少计算量,可以只提取掩码对应位置的列索引做计算:
mask = mask.astype(bool) row_idx, col_idx = np.where(mask) a[mask] *= b[col_idx]
内容的提问来源于stack exchange,提问作者Nasorenga
相关产品推荐
相关产品推荐

