在Python中从头开始构建bucketlist柱状图

2024-10-01 17:36:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究Think Python,这里有一个exercise,你要写一个函数,它执行以下操作:

  • 作为参数:L(一组数字)和n(和int)
  • n子列表的形式返回直方图
    • 每个子列表表示L中的数字所覆盖范围的子划分,并包含一个int,表示L中有多少元素属于该子划分

所以我们看一个数字范围,把这个范围分成n相等的桶,然后用这些桶建立一个直方图。本练习前面的部分将介绍如何在处理区间[0.0,1.0]中的随机浮点数列表时构建这样一个函数。它查看元素在该间隔中的位置(即它的值),将其乘以n,然后转换为int(在进程中截断)。这将产生一个int in[0,n),这是适当的bucket索引。在

不同的是,我们没有在预先确定的(方便的)时间间隔内工作。这是我想到的。我想知道有没有更优雅的方法来做这个。我将间隔计算为max(L) - min(L),但必须添加一点额外的元素,否则L中最大的元素得到一个索引n(超出范围),而它应该得到n-1。我打电话给那个小外号extraBit。在

def histogram(L, n):
    hist = [0] * numBuckets
    minVal = min(L)
    maxVal = max(L)
    extraBit = .0000000000001
    interval = (maxVal - minVal) + extraBit

    for i in L:
        placement = (i - minVal) / interval
        index = int(placement * numBuckets)
        hist[index] = hist[index] + 1

    return hist

有更漂亮的方法吗?在


Tags: 方法函数in元素列表index间隔数字
1条回答
网友
1楼 · 发布于 2024-10-01 17:36:05

上周我写了我自己的:

def frequency_count(itt, nr_bins, minn=None, maxx=None):
    ret = []
    if minn == None:
        minn = min(itt)
    if maxx == None:
        maxx = max(itt)
    binsize = (maxx - minn) / float(nr_bins) #man, do I hate int division

    #construct bins
    ret.append([float("-infinity"), minn, 0]) #-inf -> min
    for x in range(0, nr_bins):
        start = minn + x * binsize
        ret.append([start, start+binsize, 0])
    ret.append([maxx, float("infinity"), 0]) #maxx -> inf

    #assign items to bin
    for item in itt:
        for binn in ret:
            if binn[0] <= item < binn[1]:
                binn[2] += 1        
    return ret 

这一个允许您获取值的一部分,而不是整个范围。它通过添加-inf->;min和max->;inf catchall bucket修复了溢出问题。我不知道你是否能接受。在

相关问题 更多 >

    热门问题