You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找NumPy数组中出现频率最高的子数组?

解决NumPy数组中寻找出现频率最高的子数组问题

我明白你遇到的问题了——要找出二维NumPy数组中出现次数最多的完整子数组(比如示例里的[0.,0.]),但常规统计方法因为NumPy数组不可哈希没法直接用,scipy.stats.mode又只会按轴返回各列的众数组合,完全不是你想要的结果。下面给你两个实用的解决方案:

方法一:转换为元组,用collections.Counter统计

这个方法简单直观,适合小规模数组:

  • 先把数组的每一行转换成可哈希的元组
  • 用Counter统计每个元组的出现次数
  • 提取出现次数最多的元组,再转回NumPy数组
import numpy as np
from collections import Counter

# 你的示例数组
arr = np.array([[1., 1.], [2., 1.], [0., 1.], [0., 0.], [0., 0.]])

# 将每一行转为元组
row_tuples = [tuple(row) for row in arr]
# 统计频率
freq_counter = Counter(row_tuples)
# 获取出现次数最多的子数组,转回NumPy数组格式
most_common_subarray = np.array(freq_counter.most_common(1)[0][0])

print(most_common_subarray)  # 输出: [0. 0.]

方法二:用NumPy视图转换为可哈希类型(高效适合大数组)

如果你的数组规模很大,用NumPy原生的视图转换会更高效,避免Python循环的开销:

  • 利用view把每个子数组打包成一个不可变的void类型元素(可哈希)
  • 用np.unique统计每个元素的出现次数
  • 找到次数最多的元素,再转回原数组的格式
import numpy as np

arr = np.array([[1., 1.], [2., 1.], [0., 1.], [0., 0.], [0., 0.]])

# 创建视图,将每个2元素子数组转为单个可哈希的void元素
subarray_view = arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))
# 获取唯一元素和对应的出现次数
unique_subviews, counts = np.unique(subarray_view, return_counts=True)
# 找到出现次数最多的元素索引
max_freq_idx = counts.argmax()
# 将视图转回原数组的子数组格式
most_common_subarray = unique_subviews[max_freq_idx].view(arr.dtype).reshape(arr.shape[1])

print(most_common_subarray)  # 输出: [0. 0.]

为什么scipy.stats.mode不适用?

scipy.stats.mode的逻辑是按轴独立计算众数,比如你的示例数组:

  • 第一列的元素是[1.,2.,0.,0.,0.],众数是0.
  • 第二列的元素是[1.,1.,1.,0.,0.],众数是1.
    所以它会返回[[0.,1.]],这是各列众数的组合,而不是整个子数组的众数,自然不符合你的需求。

内容的提问来源于stack exchange,提问作者draco_alpine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:27:11