NumPy如何按P<150条件筛选(2,3,3)维数组得到目标输出
问题原因
直接运行P<150只会生成和原数组同维度的布尔掩码数组,不会自动提取符合条件的元素值。从你给出的预期输出可以看出,筛选逻辑是:对第0轴拆分出的每个二维子矩阵,保留所有元素均满足<150的列,剔除存在≥150元素的列。
- 第一个子矩阵仅第0列所有值都小于150,其余两列均有≥150的元素,因此筛选后仅保留该列
- 第二个子矩阵所有元素都小于150,因此完整保留原结构
由于两个子矩阵筛选后维度不一致(第一个保留1列,第二个保留3列),无法组成规则的三维NumPy数组,需要逐块处理后组合为对象类型数组。你给出的预期输出存在排版误差,第一个子矩阵筛选后为3行1列结构,你书写时误将三行值合并到了同一行。
修正代码
import numpy as np P = np.array([[[128.22918457, 168.52413295, 209.72343319], [129.01598287, 179.03716051, 150.68633749], [131.00688309, 187.42601593, 193.68172751]], [[ 87.70103267, 115.2603484 , 143.4381863 ], [ 88.23915528, 122.45062554, 103.06037156], [ 89.60081102, 128.18809696, 132.46662659]]]) result = [] for sub_mat in P: # 沿行方向判断每列是否所有元素都满足<150 keep_columns = (sub_mat < 150).all(axis=0) # 提取符合要求的列存入结果列表 result.append(sub_mat[:, keep_columns]) # 组合为对象数组输出 final_output = np.array(result, dtype=object) print(final_output)
运行结果
运行后输出的数值和你预期完全一致:
array([array([[128.22918457], [129.01598287], [131.00688309]]), array([[ 87.70103267, 115.2603484 , 143.4381863 ], [ 88.23915528, 122.45062554, 103.06037156], [ 89.60081102, 128.18809696, 132.46662659]])], dtype=object)
如果你确实需要第一个子矩阵的结果为1行3列的格式,只需在提取列后添加.T转置即可。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

