我有一个关于使用所需的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
的巨大值,整个过程需要很长时间(小时......)。您有什么想法来改进此代码吗?提前谢谢!
答案 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?我想你错过了什么。
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的方法可以为你完成工作。它也可以很好地扩展。