gpt4 book ai didi

python - 按步长值更改对数组中的数字进行分组

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:10 25 4
gpt4 key购买 nike

我有一个像 [101, 107, 106, 199, 204, 205, 207, 306, 310, 312, 312, 314, 317, 318, 380, 377, 379, 382,​​ 466, 469, 471 , 472, 557, 559, 562, 566, 569...]

在这个数组中,在几个整数之后,值会发生阶跃变化。(比如[101,107,106]和[199,204,...]之间)或者换句话说,数组由整数组组成,每组的值都以未知平均值为中心。但我不知道总共有多少组,每个组中的整数个数也不确定。

我如何将每个步骤中的这些整数分组到不同的数组中。

谢谢

最佳答案

你可以试试这个:确定每对连续数字的差异,并从中确定平均差异。

nums = [101, 107, 106, 199, 204, 205, 207, 306, 310, 312, 312, 314, 317, 318, 
380, 377, 379, 382, 466, 469, 471, 472, 557, 559, 562, 566, 569]
pairs = list(zip(nums, nums[1:]))
diffs = [abs(x-y) for x, y in pairs]
avg_diff = sum(diffs) / len(diffs) # ~ 18.31

现在,您可以根据与前一个数字的差异是低于还是高于平均值对数字进行分组:

groups = [[nums[0]]]          # first group already has first number
for (x, y), d in zip(pairs, diffs):
if d < avg_diff:
groups[-1].append(y) # add to last group
else:
groups.append([y]) # start new group

或者,如果您更喜欢跨越三行的单行代码,则此行可能适合您:

groups = [functools.reduce(lambda A, b: A+(b[1],) if A else b, group, None) 
for key, group in itertools.groupby(zip(nums, nums[1:]),
key=lambda t: abs(t[0]-t[1]) < 18.3) if key]

你的例子的结果是这样的:

[[101, 107, 106],
[199, 204, 205, 207],
[306, 310, 312, 312, 314, 317, 318],
[380, 377, 379, 382],
[466, 469, 471, 472],
[557, 559, 562, 566, 569]]

当然,如果存在组内部差异大不相同的组,这就会崩溃,如 [1, 4, 2, 5, 1042, 1230, 920, 3, 2, 5]。如果是这种情况,您可以尝试使用数字的相对 差异,例如max(x,y)/min(x,y) 而不是 abs(x-y)

关于python - 按步长值更改对数组中的数字进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47290732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com