求助:计算Numpy数组中符合特定非支配条件的行数
帕累托最优行统计解决方案
问题明确
给定一个50行15列的Numpy数组,需要统计满足以下条件的行数:不存在其他行(排除自身),使得该行所有列值≤当前行,且至少有一列值严格小于当前行。
核心逻辑
这个问题本质是寻找数组中的帕累托最优行——即没有其他行能在所有维度上不劣于它,同时至少在一个维度上更优。
实现步骤
1. 生成行比较矩阵
利用Numpy的广播特性,计算每一行与其他所有行的逐列比较结果:
- 先判断
行j的所有列是否≤行i - 再判断
行j是否至少有一列严格<行i - 合并两个条件,得到
行j是否“弱小于”行i的矩阵
2. 筛选符合要求的行
对于每一行,若对应的比较行中没有任何一行满足“弱小于”条件,则该行符合要求,统计这类行的总数。
代码实现
import numpy as np # 假设你的数据已经转为Numpy数组x # x = x.to_numpy() # 示例数据测试 x = np.array([ [10, 80], [20, 70], [30, 90], [25, 50], [35, 10], [40, 60], [50, 10] ]) # 计算行i >= 行j的逐列布尔矩阵 row_ge = x[:, np.newaxis, :] >= x[np.newaxis, :, :] # 行j弱小于行i的条件:所有列<=行i,且至少一列<行i weak_less_mask = np.all(row_ge, axis=2) & np.any(x[:, np.newaxis, :] > x[np.newaxis, :, :], axis=2) # 排除自身比较(对角线置为False) np.fill_diagonal(weak_less_mask, False) # 统计无弱小于行的数量 valid_count = np.sum(~np.any(weak_less_mask, axis=1)) print(valid_count) # 示例输出:3
性能说明
对于50行15列的数据集,该算法的时间复杂度为O(n²*d)(n=50,d=15),计算量极小,无需额外优化。
内容的提问来源于stack exchange,提问作者Dinc Kirikci
相关产品推荐
相关产品推荐

