NumPy按条件筛选数组元素时如何保持原数组尺寸?
问题根因
原代码存在两个核心错误:
- 初始化零矩阵尺寸错误:原数组
x是3行2列结构,你初始创建的是3*3尺寸的ppoc,和原数组尺寸不匹配 - 索引用法逻辑错误:
ppoc[0, ixu]的写法是取矩阵第0行对应索引位置的数值,会直接压缩维度,根本无法保留原数组的形状结构,自然得不到预期结果
另外你代码里写的判断条件x>2和你文字描述的「查找大于3的元素」不一致,按你给出的期望输出[[0,0], [3,4], [5,6]],实际判断条件应为x>2。
可行实现方案
这类需要保留原数组形状、不符合条件位置置0的筛选需求,直接用NumPy的布尔掩码逻辑实现即可,不需要调用np.argwhere取坐标。
方案1:np.where 最简写法
直接调用np.where按条件填充值,一行代码就能搞定:
import numpy as np x = np.array([[1,2], [3,4], [5,6]]) # 语法:np.where(判断条件, 条件为真时取的值, 条件为假时取的值) ppoc = np.where(x > 2, x, 0)
运行后ppoc的输出为:
[[0 0] [3 4] [5 6]]
和原数组x尺寸完全一致,符合要求。如果需要严格按「大于3」的逻辑筛选,只需要把判断条件改成x > 3,对应输出为[[0 0] [0 4] [5 6]]。
方案2:布尔索引赋值写法
如果觉得np.where不好理解,也可以先初始化同形状零矩阵,再通过布尔索引给符合条件的位置赋值:
# 生成和x完全同形状的零矩阵,不用手动指定行列数 ppoc = np.zeros_like(x) # 生成布尔掩码,符合条件的位置为True,其余为False mask = x > 2 # 把符合条件位置的x值,赋值到ppoc对应位置 ppoc[mask] = x[mask]
运行结果和方案1完全一致。
补充说明:
np.argwhere返回的是符合条件元素的坐标列表,适合需要拿到坐标做自定义遍历、位置计算的场景,做这种同形状掩码筛选时直接用布尔数组效率更高,也不会出现维度错乱的问题。
内容的提问来源于stack exchange,提问作者user15788706
相关产品推荐
相关产品推荐

