将数值合并到一定范围内的有效方法是什么?例如,假设我有一个值列表,我想按它们的范围将它们分成N个bin.现在,我做这样的事情:
from scipy import *
num_bins = 3 # number of bins to use
values = # some array of integers...
min_val = min(values) - 1
max_val = max(values) + 1
my_bins = linspace(min_val, max_val, num_bins)
# assign point to my bins
for v in values:
best_bin = min_index(abs(my_bins - v))
Run Code Online (Sandbox Code Playgroud)
其中min_index返回最小值的索引.我们的想法是,您可以通过查看具有最小差异的bin来找到该点落入的bin.
但我认为这有奇怪的边缘情况.我正在寻找的是一个很好的代表箱子,理想情况下半封闭半开(所以没有办法将一个点分配到两个箱子),即
bin1 = [x1, x2)
bin2 = [x2, x3)
bin3 = [x3, x4)
etc...
Run Code Online (Sandbox Code Playgroud)
使用numpy/scipy在Python中执行此操作的好方法是什么?我只关心binning整数值.
非常感谢您的帮助.
Alo*_*hal 25
numpy.histogram() 完全符合你的要求.
功能签名是:
numpy.histogram(a, bins=10, range=None, normed=False, weights=None, new=None)
Run Code Online (Sandbox Code Playgroud)
我们最感兴趣的是a和bins. a是需要分箱的输入数据. bins可以是多个箱子(你的num_bins),或者它可以是一系列标量,表示箱边(半开).
import numpy
values = numpy.arange(10, dtype=int)
bins = numpy.arange(-1, 11)
freq, bins = numpy.histogram(values, bins)
# freq is now [0 1 1 1 1 1 1 1 1 1 1]
# bins is unchanged
Run Code Online (Sandbox Code Playgroud)
引用文档:
除最后一个(最右边)的垃圾箱之外的所有垃圾箱都是半开的.换句话说,如果
bins是:Run Code Online (Sandbox Code Playgroud)[1, 2, 3, 4]然后第一个bin
[1, 2)(包括1,但不包括2)和第二个bin[2, 3).最后一个垃圾桶,但是,是[3, 4],其中包括 4.
编辑:您想知道每个元素的bin中的索引.为此,您可以使用numpy.digitize().如果您的垃圾箱将是不可或缺的,您也可以使用numpy.bincount().
>>> values = numpy.random.randint(0, 20, 10)
>>> values
array([17, 14, 9, 7, 6, 9, 19, 4, 2, 19])
>>> bins = numpy.linspace(-1, 21, 23)
>>> bins
array([ -1., 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.,
10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.,
21.])
>>> pos = numpy.digitize(values, bins)
>>> pos
array([19, 16, 11, 9, 8, 11, 21, 6, 4, 21])
Run Code Online (Sandbox Code Playgroud)
由于间隔在上限打开,因此索引是正确的:
>>> (bins[pos-1] == values).all()
True
>>> import sys
>>> for n in range(len(values)):
... sys.stdout.write("%g <= %g < %g\n"
... %(bins[pos[n]-1], values[n], bins[pos[n]]))
17 <= 17 < 18
14 <= 14 < 15
9 <= 9 < 10
7 <= 7 < 8
6 <= 6 < 7
9 <= 9 < 10
19 <= 19 < 20
4 <= 4 < 5
2 <= 2 < 3
19 <= 19 < 20
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29825 次 |
| 最近记录: |