gpt4 book ai didi

python - Python 中的数字分组/聚类以及数字之间的相对关系

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:39 24 4
gpt4 key购买 nike

我需要与要求类似的东西 here ,但更多的是相反:

给定一个数字列表(上面问题的示例):[1, 6, 9, 100, 102, 105, 109, 134, 139] 我不想说最大间隙(在该示例中为 10)但我想要多少组。

例如3 组:1、6、9/100、102、105、109/134、1392 组:1、6、9/100、102、105、109、134、139...

这应该是相对有效的,因为我的数字非常非常不同:[0.1, 0.2, 1, 4, 100, 110] =>3 组应得出 0.1、0.2/1、4/100、110

尽管从绝对值来看,0.2 和 1 比 1 和 5 更接近(0.8 与 3),但在关系上,0.2 距离 1 (5x) 比 0.1 (2x) 更远。

我希望我能清楚地知道我想要实现什么......

最佳答案

如果数字列表不是巨大,我会首先计算一个数字与其先例之间的每个比率,然后选择最大的分割。

例如:

def split_numbers_list(numbers_list, n_groups):
# If the number of groups is 1 or less, the whole list the only group
if n_groups <= 1:
return [numbers_list]
n_splits = min(len(numbers_list), n_groups) # Can't have more groups than elements
# Now we calculate the ratios and store them in (index, ratio) tuples
ratios = [
(i, numbers_list[i + 1] / numbers_list[i]) for i in range(len(numbers_list) - 1)
]
sorted_ratios = sorted(ratios, key=lambda r: r[1], reverse=True)
# `chosen_splits` stores the boundaries of each group
chosen_splits = (
[0]
+ sorted([r[0] + 1 for r in sorted_ratios[: n_splits - 1]])
+ [len(numbers_list)]
)
return [
numbers_list[chosen_splits[i] : chosen_splits[i + 1]]
for i in range(len(chosen_splits) - 1)
]

但请注意 numbers_list 的假设:它必须是排序严格正数字列表,否则该函数将不会工作。

一些例子:

>>> my_list = [1, 2, 3, 4, 5, 100, 101, 103, 504, 2301]

>>> split_numbers_list(my_list, 5)
[[1], [2, 3, 4, 5], [100, 101, 103], [504], [2301]]

>>> split_numbers_list(my_list, 3)
[[1, 2, 3, 4, 5], [100, 101, 103], [504, 2301]]

关于python - Python 中的数字分组/聚类以及数字之间的相对关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55844866/

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