在0.20中有一个有趣的API,名为Intervalindex
new,它允许您创建间隔索引。在
给出一些样本数据:
data = [(893.1516130000001, 903.9187099999999),
(882.384516, 893.1516130000001),
(817.781935, 828.549032)]
您可以这样创建索引:
^{pr2}$Interval
s的一个有趣的特性是,可以使用in
执行间隔检查:
print(y[-1])
Interval(817.78193499999998, 828.54903200000001, closed='right')
print(820 in y[-1])
True
print(1000 in y[-1])
False
我想知道如何将此操作应用于整个索引。例如,给定某个数字900
,如何检索这个数字所适合的区间的布尔掩码?在
我能想到:
m = [900 in y for y in idx]
print(m)
[True, False, False]
有更好的方法吗?在
您可以使用
map
:时间安排:
^{pr2}$很明显,理解是最快的,但是内置的
map
不会落后太多。在当我们引入更多的数据,精确地说,是更多数据的10万倍时,结果仍然是:
正如我们所见,内置的
map
非常接近.map()
所以-让我们看看10倍以上的数据会发生什么:结论:
理解是赢家,但在大量的数据上并不明显。在
如果你在寻找速度,你可以使用idx的左和右,也就是说,从这个范围得到下限和上限,然后检查数字是否在界限之间,即
或者
^{pr2}$对于小数据
对于大数据
这种方法比你的大数据解决方案要好。在
如果您对性能感兴趣,IntervalIndex会针对搜索进行优化。使用}使用内部构建的IntervalTree(类似于二叉树),它是在第一次使用时构造的。在
.get_loc
或{请注意.get_loc()返回一个索引器(这实际上比布尔数组更有用,但它们可以相互转换)。在
^{pr2}$返回布尔数组将转换为索引器数组
这是.get_loc()和.get_indexer()返回的内容:
相关问题 更多 >
编程相关推荐