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

如何用numpy/scipy/pandas高级函数基于偏移量对有序列表分箱

问题描述

现有一个无重复的有序列表:

ls = [0, 1, 2, 4, 6, 7]  # 无重复且已排序

需要基于偏移量(示例中offset=1)对该列表进行分箱,预期输出如下:

[[0, 1, 2], [4], [6, 7]]
# 说明:
# [0,1,2]中0和2的差不是1,但1和2的差是1,这正是我想要的分组逻辑

请问numpy、scipy、pandas等Python库中是否存在可实现该需求的高级函数?返回的数据结构不限。

解决方案

当然有,几个常用库都能实现这个需求,以下是具体方法:

1. 使用numpy实现

利用numpy.diff()计算相邻元素的差值,找到差值大于偏移量的位置,再用numpy.split()拆分数组:

import numpy as np

ls = [0, 1, 2, 4, 6, 7]
offset = 1
arr = np.array(ls)
# 找到相邻元素差大于offset的索引位置
split_indices = np.where(np.diff(arr) > offset)[0] + 1
# 拆分数组
result = np.split(arr, split_indices)
# 转成列表格式(可选)
result = [subarr.tolist() for subarr in result]
print(result)  # 输出: [[0, 1, 2], [4], [6, 7]]

2. 使用pandas实现

通过计算相邻元素的差值,生成分组标识,再用groupby()分组:

import pandas as pd

ls = [0, 1, 2, 4, 6, 7]
offset = 1
df = pd.DataFrame({'val': ls})
# 计算相邻元素差,大于offset则标记为新分组起点
df['group'] = (df['val'].diff() > offset).cumsum()
# 分组后提取每组的值
result = [group['val'].tolist() for _, group in df.groupby('group')]
print(result)  # 输出: [[0, 1, 2], [4], [6, 7]]

这两种方法都是利用了列表已排序且无重复的特性,通过判断相邻元素的差值是否超过偏移量来划分分组,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17