例如,如果我有
MAX_ALLOWED_DIFF = 3
nums=[1, 2, 4, 10, 13, 2, 5, 5, 5]
输出应为
groups = [[1, 2, 4], [10, 13], [2, 5, 5, 5]]
上下文:我有一个pandas.Series object nums
,我曾经使用过
nums = nums.diff().gt(DETECTION_MAX_DIFF_NS).cumsum()).apply(list).tolist()
以相同的方式进行二次采样,但是我发现Series nums
中有很多重复项,并且在我使用.unique()
方法之后,我不再有Series
对象了,我有numpy.ndarray
(1D)。
我相信我可能会使用pandas.Series(nums.unique)
之类的东西,但我不喜欢这种技巧。
答案 0 :(得分:3)
这是一种方法-
>>> import numpy as np
>>> idx = np.r_[0,np.flatnonzero(np.abs(np.diff(nums))>MAX_ALLOWED_DIFF)+1,len(nums)]
>>> [nums[i:j] for (i,j) in zip(idx[:-1],idx[1:])]
[[1, 2, 4], [10, 13], [2, 5, 5, 5]]
答案 1 :(得分:3)
因此,我们使用drop_duplicates
,将nums
留在pd.Series
nums=nums.drop_duplicates()
nums.groupby(nums.diff().abs().gt(MAX_ALLOWED_DIFF).cumsum()).apply(list).tolist()
Out[447]: [[1, 2, 4], [10, 13], [5]]
答案 2 :(得分:2)
考虑到您也标记了numpy
,这是一种实现方法:
thr = 3
ix = np.flatnonzero(np.concatenate([[False], np.abs(np.diff(nums))>thr]))
np.split(nums, ix)
输出
[array([1, 2, 4]), array([10, 13]), array([2, 5, 5, 5])]