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

Numpy中基于指定参考数组统计另一数组元素出现频次的方法

Numpy 统计指定参考数组中元素出现频次的实现方法

问题背景

需要统计数组arr1中各元素在已排序、无重复的参考数组arr2中的出现频次,要求包含频次为0的元素的统计值。
示例输入:

arr1 = np.array([1, 0, 3, 0, 3, 0, 3, 0, 8, 0, 1, 8, 0])
arr2 = np.array([0, 1, 2, 8])

预期输出:

freq = np.array([6, 2, 0, 2])

原有实现np.unique(arr1, return_counts=True)只能统计arr1中实际存在的元素,无法输出频次为0的项,以下是可行的实现方案:

方案1:高效适配排序参考数组(推荐)

利用arr2已排序的特性,用np.searchsorted匹配位置,再统计频次,时间复杂度低,适合大数据量场景:

import numpy as np

# 匹配arr1元素在arr2中的插入位置
idx = np.searchsorted(arr2, arr1)
# 过滤掉arr1中不存在于arr2的元素:先判断索引不越界,再验证位置对应的元素确实匹配
valid_mask = (idx < len(arr2)) & (arr2[idx] == arr1)
# 统计频次,minlength保证输出长度和arr2一致,自动补全频次为0的项
freq = np.bincount(idx[valid_mask], minlength=len(arr2))

方案2:小数据量直观实现

如果数组规模不大,可以用广播对比的方式,代码更简洁易读:

# arr2[:, None]将arr2转为列向量,和arr1广播对比后按行求和得到每个元素的出现次数
freq = (arr1 == arr2[:, None]).sum(axis=1)

方案3:基于原有np.unique的补全方案

如果习惯用np.unique,可以对输出结果做补全适配:

unique_vals, counts = np.unique(arr1, return_counts=True)
freq = np.zeros(len(arr2), dtype=int)
# 匹配arr1独有的元素在arr2中的位置
pos = np.searchsorted(arr2, unique_vals)
# 仅给确实存在于arr2中的元素赋值计数
valid = (pos < len(arr2)) & (arr2[pos] == unique_vals)
freq[pos[valid]] = counts[valid]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03