如何获取二维NumPy数组中出现最频繁的唯一行组合?
获取二维NumPy数组中出现最频繁的唯一行
你需要的是找到数组中整行重复次数最多的唯一行,而非scipy.stats.mode(axis=0)返回的"各列众数拼接行"。以下是两种可行的解决方案:
方法一:纯NumPy实现(无额外依赖)
利用np.unique按行去重并统计次数,再筛选出次数最多的行:
import numpy as np arr1 = np.array([[2,3,4],[2,1,5],[1,2,3],[2,4,4],[2,8,2],[2,3,1],[9,9,9],[9,9,9]]) # 按行去重,同时返回每行的出现次数 unique_rows, counts = np.unique(arr1, axis=0, return_counts=True) # 找到出现次数最多的行的索引 max_idx = np.argmax(counts) # 获取结果 most_frequent_row = unique_rows[max_idx] print(most_frequent_row) # 输出: [9 9 9] print(f"出现次数: {counts[max_idx]}") # 输出: 出现次数: 2
方法二:利用Pandas简化操作
如果你的环境已安装Pandas,可以用value_counts快速实现:
import pandas as pd import numpy as np arr1 = np.array([[2,3,4],[2,1,5],[1,2,3],[2,4,4],[2,8,2],[2,3,1],[9,9,9],[9,9,9]]) # 转成DataFrame后统计行的出现频率 df = pd.DataFrame(arr1) most_frequent_row = df.value_counts().idxmax() # 转换为NumPy数组格式输出 print(most_frequent_row.values) # 输出: [9 9 9]
为什么scipy.stats.mode(axis=0)不符合需求?
stats.mode(axis=0)是对数组的每一列独立计算众数,再将各列的众数拼接成一行。比如你的示例中,第一列的众数是2(出现5次),第二列的众数是3(出现2次),第三列的众数是4(出现2次),所以拼接出[2,3,4],但这行在原数组中只出现过1次,并非整行重复最多的结果。
内容的提问来源于stack exchange,提问作者lingyau lee
相关产品推荐
相关产品推荐

