gpt4 book ai didi

Python:根据属于特定范围内的项目数量从列表中创建分布

转载 作者:行者123 更新时间:2023-11-28 21:30:12 27 4
gpt4 key购买 nike

我用 poisson 标记了这个问题,因为我不确定它在这种情况下是否有用。

我需要根据数据列表创建一个分布(最后可能格式化为图像)。

例如:

data = [1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 10, 10, 10, 22, 30, 30, 35, 46, 58, 59, 59]

这样数据就可以用来创建视觉分布。例如,在这种情况下,我可能会说范围在 10 以内,并且每个范围中至少需要有 3 个项目才能成为有效点。

使用此示例数据,我希望结果类似于

ditribution = [1, 2, 4, 6]

因为我在 0-9、10-19、30-39 和 50-59 范围内有 > 3 个项目。使用该结果,我可以生成一个图像,该图像将我的最终分布中存在的部分分割出来(较深的颜色)。下面可以看到我尝试创建的图像类型的示例,并且生成的数据要多得多。暂时忽略蓝线。

我知道如何通过蛮力 遍历列表中的每个项目并像那样进行计算。但是,我的数据集可能有几十万,甚至几百万个数字。在现实世界的示例中,我的范围 (10) 和所需的项目数 (3) 可能会大得多。

distribution image

感谢您的帮助。

最佳答案

如果data总是排序,一个紧凑的方法可能是:

import itertools as it

d = [k+1 for k, L in
((k, len(list(g))) for k, g in it.groupby(data,key=lambda x:x//10))
if L>=3]

如果data未排序,或者如果您不知道,请使用 sorted(data)作为 itertools.groupby 的第一个参数, 而不仅仅是 data .

如果您更喜欢不太密集/紧凑的方法,您当然可以扩展它,例如到:

def divby10(x): return x//10

distribution = []
for k, g in it.groupby(data, key=divby10):
L = len(list(g))
if L < 3: continue
distribution.append(k+1)

无论哪种情况,机制都是 groupby首先应用作为 key= 传递的可调用对象作为第一个参数传递给可迭代对象中的每个项目,以获得每个项目的“键”;对于具有相同“键”的每组连续项目,groupby产生一个包含两个项目的元组:键的值,以及对所述组中所有项目的迭代。

这里,key是一个item除以10得到的(有截断); len(list(g))是具有该“键”的连续项目的数量。由于项目必须是连续的,因此您需要对数据进行排序(并且,仅对其进行排序比“按值除以 10 并截断”排序更简单;-)。

关于Python:根据属于特定范围内的项目数量从列表中创建分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3550264/

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