Python:统计NumPy一维数组中各值的最大连续出现次数
统计NumPy数组中每个值的最大连续出现次数
给定一维NumPy数组,需要统计数组中每个特定值的最大连续出现次数,返回一个二维数组:第一列为数组中的所有唯一数值,第二列为对应数值的最大连续出现次数。
示例输入:
import numpy as np arr = np.array([1,1,1,2,2,3,4,4,4,4,4,2,4,4])
示例输出:
result = np.array([[1,3],[2,2],[3,1],[4,5]])
实现代码
import numpy as np def max_consecutive_count(arr): # 计算元素变化的分界点(添加首尾哨兵确保完整识别所有连续段) diff = np.diff(arr, prepend=[arr[0]-1], append=[arr[-1]+1]) change_indices = np.where(diff != 0)[0] # 获取每个连续段的长度和对应的数值 segment_lengths = np.diff(change_indices) segment_values = arr[change_indices[:-1]] # 遍历所有唯一值,提取对应最大连续长度 unique_values = np.unique(arr) max_lengths = [segment_lengths[segment_values == val].max() for val in unique_values] # 组合成目标二维数组 return np.column_stack((unique_values, max_lengths)) # 测试示例 arr = np.array([1,1,1,2,2,3,4,4,4,4,4,2,4,4]) result = max_consecutive_count(arr) print(result)
代码说明
- 识别连续段分界点:通过
np.diff计算相邻元素的差异,添加首尾哨兵值(与原数组首尾元素不同),确保首尾的连续段也能被完整检测到。 - 计算连续段长度:对分界点索引取差值,得到每个连续段的元素个数。
- 匹配段与数值:每个分界点的前一个位置对应连续段的起始数值,以此得到所有连续段的数值列表。
- 提取最大长度:针对每个唯一值,筛选出其对应的所有连续段长度,取最大值。
- 组合结果:用
np.column_stack将唯一值和对应最大长度拼接成二维数组。
该方法基于NumPy向量化操作,比Python循环更高效,适合处理大规模数组。
内容的提问来源于stack exchange,提问作者xc-2021
相关产品推荐
相关产品推荐

