urg*_*geo 2 python bin dynamic-rebinding
我有一个关于用所需的 bin 宽度重新排列数字列表的问题。这基本上就是频率直方图的作用,但我不需要绘图,只需要箱数和每个箱的出现次数。
到目前为止,我已经编写了一些可以实现我想要的功能的代码,但效率不是很高。给定一个 list a,为了将其重新装箱,箱宽度等于 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
Run Code Online (Sandbox Code Playgroud)
现在,这正是我想要的,但我认为它不是那么聪明,因为它会读取整个列表N时间以及N垃圾箱的数量。对于小列表来说这很好。但是,由于我必须处理非常大的列表和相当小的箱宽,这会转化为巨大的值,N并且整个过程需要很长时间(几个小时......)。您有任何改进此代码的想法吗?先感谢您!
如果您使用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)
Run Code Online (Sandbox Code Playgroud)
输出:
[3 3 4]
[ 0.3.6.9.]
bin_edges 中有 4 个值:0、3、6 和 9。除了最后一个(最右边)之外的所有 bin 都是半开的。这意味着我们有 3 个区间 [0,3)、[3,6) 和 [6,9],每个 bin 中有 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)
Run Code Online (Sandbox Code Playgroud)
输出:
[1 2]
[0 1 2]
现在 [0 ,1) 中有 1 个元素,[1,2] 中有 2 个元素。
| 归档时间: |
|
| 查看次数: |
13446 次 |
| 最近记录: |