快速将数组分配到n个长度相等的箱子中

2024-06-01 14:50:25 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有一个数组流,其数字范围从0.010.0之间。在

我想把arr中的数字快速分配给长度相等的5个箱子。在

我所说的等长度是[0.0, 2.0), [2.0, 4.0), [4.0, 6.0), [6.0, 8.0), [8.0, 10.0]。在

问题是最后一个间隔和其他间隔不一样。在

测试:

import numpy as np
# Things we know and can pre-calculate
n_bins = 5
minimal = 0.0  
maximal = 10.0
reciprocal_bin_length = n_bins / (maximal - minimal)

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

norm_data = (data - minimal) * reciprocal_bin_length
norm_data = norm_data.astype(int)
print(norm_data.max())
print(norm_data.min())

结果:

^{pr2}$

bin索引应为0、1、2、3或4,但不是5。在


Tags: normdata间隔binnp数字数组length
2条回答

“穷人的解决方案”可以是计算数组norm_data和{}之间的minimum

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

所以所有的5s(及以上)都将被转换成4s。请注意,在这里您当然不会进行适当的范围检查(120.0也将以bin 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())

相关问题 更多 >