0

我正在研究Think Python,并且有一个练习,您将编写一个执行以下操作的函数:

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

所以我们正在查看一系列数字,将该范围分成n相等的桶,并用这些桶构建直方图。本练习之前的部分展示了在处理区间 [0.0, 1.0) 中的随机浮点数列表时如何构建这样的函数。它查看元素在该区间中的位置(这只是它的值),将其乘以n,然后转换为 int (在过程中截断)。这会在 [0, n) 中产生一个 int,它是合适的桶索引。

这里的区别在于我们不是在预定的(和方便的)间隔内工作。这就是我想出的。我想知道是否有更优雅的方式来做到这一点。我将我的区间计算为max(L) - min(L),但必须添加一些额外的,否则 in 中的最大元素L将获得 n 的索引(超出范围),而它应该得到 n - 1。我调用了 little extra 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

有没有更漂亮的方法来做到这一点?

4

1 回答 1

2

我上周写了自己的:

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 存储桶解决了您的溢出问题。我不知道这是否适合你。

于 2013-02-05T16:59:22.840 回答