Python 快速将数组分配给长度相等的n个存储箱

Python 快速将数组分配给长度相等的n个存储箱,python,numpy,binning,discretization,Python,Numpy,Binning,Discretization,例如,我有一个数组流,其数字范围从0.0到10.0不等 我想快速地将arr中的数字分配给长度相等的5箱子 通过等长,我的意思是箱子间隔是[0.0,2.0],[2.0,4.0],[4.0,6.0],[6.0,8.0],[8.0,10.0] 问题是最后一个间隔与其他间隔不同 测试: 结果: 5 0 bin索引应该是0、1、2、3或4,而不是5。一个“穷人的解决方案”可以是计算数组norm_数据和nbins-1: norm_data = np.minimum(norm_data,nbins-1)

例如,我有一个数组流,其数字范围从
0.0
10.0
不等

我想快速地将
arr
中的数字分配给长度相等的
5
箱子

通过等长,我的意思是箱子间隔是
[0.0,2.0],[2.0,4.0],[4.0,6.0],[6.0,8.0],[8.0,10.0]

问题是最后一个间隔与其他间隔不同

测试:

结果:

5
0
bin索引应该是0、1、2、3或4,而不是5。

一个“穷人的解决方案”可以是计算数组
norm_数据
nbins-1

norm_data = np.minimum(norm_data,nbins-1)

因此,所有
5
s(及以上)都将转换为
4
s。请注意,在这里,您当然不会进行适当的范围检查(
120.0
也将在第4箱中结束)。

如果0.1%的错误是可接受的,那么下面的检查会稍微快一点。 不确定这是否适用于浮点舍入

import numpy as np
# Things we know and can pre-calculate
n_bins = 5
minimal = 0.0  
maximal = 10.0
approx = 1.001  # <-- this is new
reciprocal_bin_length = n_bins / (maximal*approx - minimal)

# Let's say the stream gives 1001 numbers every time.
data = np.arange(1001)/100

# can use numexpr for speed.
norm_data = (data - minimal) * reciprocal_bin_length
norm_data = norm_data.astype(int)
print(norm_data.max())
print(norm_data.min())
将numpy导入为np
#我们知道并可以预先计算的事情
n_bins=5
最小值=0.0
最大值=10.0

大约=1.001#我想你可能在寻找。最小值是0。那样的话,最大值正好是10。数字化允许bin的长度不均匀,可能会更慢。这是等长。关于@jeremycg,我试着阅读pandas.cut的源代码。它似乎事先调整了最大值,就像将最大值乘以1.001。这会在装箱时产生一些小错误,但是不需要在之后进行剪裁。您的逻辑很好,只是在末尾缺少一行:
norm\u data[norm\u data>=n\u bins]=n\u bins-1
,相当于发布的解决方案。剪裁到0和n\u bins-1
import numpy as np
# Things we know and can pre-calculate
n_bins = 5
minimal = 0.0  
maximal = 10.0
approx = 1.001  # <-- this is new
reciprocal_bin_length = n_bins / (maximal*approx - minimal)

# Let's say the stream gives 1001 numbers every time.
data = np.arange(1001)/100

# can use numexpr for speed.
norm_data = (data - minimal) * reciprocal_bin_length
norm_data = norm_data.astype(int)
print(norm_data.max())
print(norm_data.min())