基于Numpy提取满足V元素非负的U各列最小值
按列提取符合条件的U元素最小值解决方案
没问题,我来帮你搞定这个需求!你需要的是针对每一列,提取U中对应V元素大于0的那些值的最小值,而不是全局所有符合条件元素的最小值,对吧?
先看你的示例数据:
- U是4行3列的数组:
[[1,2,3], [4,5,6], [7,8,9], [10,11,12]] - V对应的布尔掩码(V>0)是:
[[ True, False, True], [ True, True, True], [False, False, True], [False, False, True]]
你之前写的np.amin(U[mask])会把所有符合条件的元素拉成一维数组,得到的是全局最小值,这显然不是你要的。下面给你两种靠谱的实现方式:
方法一:用np.where替换无效值后取列最小
这种方法思路很直接:把不符合条件(V≤0)的U元素替换成无穷大(np.inf),然后按列取最小值,无穷大会被自动忽略:
import numpy as np U = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) V = np.array([[1,-1,1],[1,1,1],[-1,-1,1],[-1,-1,1]]) # 生成V>0的布尔掩码 mask = V > 0 # 将mask为False的位置替换为无穷大,保留有效元素 U_masked = np.where(mask, U, np.inf) # 按列取最小值(axis=0表示沿行方向计算,即每列的最小值) col_mins = np.amin(U_masked, axis=0) print(col_mins) # 输出:[1. 5. 3.]
方法二:用掩码数组np.ma.masked_array
numpy的掩码数组可以直接屏蔽掉不需要的元素,计算时自动忽略这些值:
import numpy as np U = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) V = np.array([[1,-1,1],[1,1,1],[-1,-1,1],[-1,-1,1]]) mask = V > 0 # 创建掩码数组,~mask表示要屏蔽的位置(即V≤0的元素) U_ma = np.ma.masked_array(U, mask=~mask) # 按列取最小值 col_mins = U_ma.min(axis=0) # 如果需要转换成普通numpy数组(去掉掩码属性) col_mins = col_mins.data print(col_mins) # 输出:[1 5 3]
两种方法都能得到你想要的结果:第一列符合条件的U元素是1、4,最小值是1;第二列符合条件的是5,最小值就是5;第三列符合条件的是3、6、9、12,最小值是3。
内容的提问来源于stack exchange,提问作者πr8
相关产品推荐
相关产品推荐

