将浮点范围放入容器中
Putting floating point ranges into bins
给定 5 个范围
[(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]
对应于:
- [0.0, 0.0]
- (0.0, 0.3]
- (0.3, 0.5]
- (0.5, 0.8]
- (0.8, 1.0]
以及输入浮点数列表:
[0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
目标是将浮点数放入上述范围并输出:
[3, 2, 3, 3, 1, 4, 0]
我试过这个:
score_ranges = [(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]
x = [0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
binning = []
for i in x:
for j, (start, end) in enumerate(score_ranges):
if i == 0:
binning.append(0)
break
elif start < i <= end:
binning.append(j)
break
但是有没有更简单的方法来获得所需的合并输出?
此外,零范围在那里有点硬编码,因为它的下限与其他范围不同 类,是否有更好的方法来处理它?
您可以使用 bisect 模块,但您必须稍微更改一下代码。将元组列表缩小为浮点数列表。
import bisect
score_ranges = [0., 0.3, 0.5, 0.8, 1.0]
binning = []
x = [
0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
for a in x:
binning.append(bisect.bisect_left(score_ranges, a))
给定 5 个范围
[(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]
对应于:
- [0.0, 0.0]
- (0.0, 0.3]
- (0.3, 0.5]
- (0.5, 0.8]
- (0.8, 1.0]
以及输入浮点数列表:
[0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
目标是将浮点数放入上述范围并输出:
[3, 2, 3, 3, 1, 4, 0]
我试过这个:
score_ranges = [(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]
x = [0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
binning = []
for i in x:
for j, (start, end) in enumerate(score_ranges):
if i == 0:
binning.append(0)
break
elif start < i <= end:
binning.append(j)
break
但是有没有更简单的方法来获得所需的合并输出?
此外,零范围在那里有点硬编码,因为它的下限与其他范围不同 类,是否有更好的方法来处理它?
您可以使用 bisect 模块,但您必须稍微更改一下代码。将元组列表缩小为浮点数列表。
import bisect
score_ranges = [0., 0.3, 0.5, 0.8, 1.0]
binning = []
x = [
0.5293113408538,
0.3105914215541,
0.7748290363338001,
0.7745464933980998,
0.17276995816109997,
0.83335888200110002,
0.0]
for a in x:
binning.append(bisect.bisect_left(score_ranges, a))