如何在np.where函数中使用多条件(或、与逻辑)筛选numpy数组指定行
问题分析与解决方案
嘿,我一眼就瞅出你代码里的问题啦!你第二个筛选条件的范围搞错了——你用了整个数组第三列的最小值,但实际应该是在第二列等于最大值的那些行里找第三列的最小值。
为什么原来的代码只返回一行?
你的数据集里,第二列的最大值是6,对应的行是[5. , 6. , 2. ]、[4. , 6. , 3. ]、[3. , 6. , 4. ],这些行的第三列最小值是2。但你原来的代码里写的是arr[:,-1]==min(arr[:,-1]),这是拿所有行的第三列和整个数组的第三列最小值(也就是1.2)对比,显然第二列是6的行里没有第三列等于1.2的,所以第二个条件永远不满足,自然只返回第一行。
修正后的代码
我们可以先把需要的关键值计算出来,再构造筛选条件,这样逻辑更清晰:
import numpy as np # 你的原始数组 arr = np.array([[6. , 1. , 1.2], [5.5, 3. , 1.5], [5. , 1. , 2. ], [5. , 3. , 2. ], [5. , 6. , 2. ], [4. , 1. , 3. ], [4. , 3. , 3. ], [4. , 6. , 3. ], [3. , 1. , 4. ], [3. , 3. , 4. ], [3. , 6. , 4. ]]) # 计算第二列的最小、最大值 min_col2 = arr[:, 1].min() max_col2 = arr[:, 1].max() # 分别计算两种场景下第三列的最小值 min_col3_min_col2 = arr[arr[:, 1] == min_col2][:, 2].min() min_col3_max_col2 = arr[arr[:, 1] == max_col2][:, 2].min() # 构造正确的筛选条件 filter_condition = ( (arr[:, 1] == min_col2) & (arr[:, 2] == min_col3_min_col2) | (arr[:, 1] == max_col2) & (arr[:, 2] == min_col3_max_col2) ) # 得到结果 result = arr[filter_condition] print(result)
运行这段代码,就能得到你预期的结果:
[[6. 1. 1.2] [5. 6. 2. ]]
简化版写法
如果你想把逻辑直接写在np.where里,也可以这样:
result = arr[np.where( ((arr[:,1] == arr[:,1].min()) & (arr[:,2] == arr[arr[:,1]==arr[:,1].min()][:,2].min())) | ((arr[:,1] == arr[:,1].max()) & (arr[:,2] == arr[arr[:,1]==arr[:,1].max()][:,2].min())) )]
这样也能达到同样的效果,不过提前计算变量的方式可读性更强哦~
内容的提问来源于stack exchange,提问作者Link_tester
相关产品推荐
相关产品推荐

