重新绑定python中的数字列表

时间:2016-08-04 16:20:46

标签: python bin dynamic-rebinding

我有一个关于使用所需的bin宽度重新绑定数字列表的问题。它基本上是频率直方图所做的,但我不想要绘图,只需要bin数和每个bin的出现次数。

到目前为止,我已经编写了一些能够满足我想要的代码,但效率并不高。给定一个列表a,为了使用bin宽度等于3来重新绑定它,我写了以下内容:

import os, sys, math
import numpy as np

# list of numbers
a = list(range(3000))

# number of entries
L = int(len(a))

# desired bin width
W = 3

# number of bins with width W
N = int(L/W)

# definition of new empty array
a_rebin = np.zeros((N, 2))

# cycles to populate the new rebinned array
for n in range(0,N):
    k = 0
    for i in range(0,L):
        if a[i] >= (W*n) and a[i] < (W+W*n):
            k = k+1
    a_rebin[n]=[W*n,k]

# print
print a_rebin

现在,这正是我想要的,但我认为它并不那么聪明,因为它读取整个列表N次,N个数量。这对小清单来说很好。但是,由于我必须处理非常大的列表和相当小的bin宽度,这会转换为N的巨大值,整个过程需要很长时间(小时......)。您有什么想法来改进此代码吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],则您的解决方案是:

  

[[0. 3.]
  [3. 3.]
  [6. 3。]]

你怎么解释这个?间隔是0..2,3..5,6..8?我想你错过了什么。

使用numpy.histogram()

hist, bin_edges = numpy.histogram(a, bins=int(len(a)/W))
print(hist)
print(bin_edges)

<强>输出:

  

[3 3 4]
  [0. 3. 6. 9.]

我们在bin_edges中有4个值:0,3,6和9.除最后一个(最右边)的bin之外的所有值都是半开的。这意味着我们有3个区间[0,3),[3,6]和[6,9],并且每个区域中有3个,3个和4个元素。
您可以定义自己的垃圾箱。

import numpy
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bins=[0,1,2]
hist, bin_edges = numpy.histogram(a, bins=bins)
print(hist)
print(bin_edges)

<强>输出:

  

[1 2]
  [0 1 2]

现在[0,1]中有1个元素,[1,2]中有2个元素。

答案 1 :(得分:0)

Numpy有一个名为np.histogram的方法可以为你完成工作。它也可以很好地扩展。