有没有一种优雅的方法可以从numpy中的一组值域中找到不相交值域的集合?
ranges = [[0,3], [2,4],[5,10]] # there are about 50 000 elements
disjoint_ranges = [] # these are all disjoint
adjoint_ranges = [] # these do not all have to be mutually adjoint
for index, range_1 in enumerate(ranges):
i, j = range_1 # all ranges are ordered s.t. i<j
for swap_2 in ranges[index+1:]: # the list of ranges is ordered by increasing i
a, b, _ = swap_2
if a<j and a>i:
adjoint_swaps.append(swap)
adjoint_swaps.append(swap_2)
else:
if swap not in adjoint_swaps:
swaps_to_do.append(swap)
print(adjoint_swaps)
print(swaps_to_do)
2条答案
按热度按时间tf7tbtn21#
在numpy数组上循环有点违背了使用numpy的目的。你可以通过利用accumulate方法来检测不相交的范围。
当你的范围按下限排序后,你可以累计上限的最大值来确定先前范围对后续范围的覆盖。然后比较每个范围的下限和先前范围的覆盖范围来了解是否存在前向重叠。然后你只需要比较每个范围的上限和下一个范围的下限来检测后向重叠。向前和向后重叠的组合将允许您标记所有重叠的范围,并且通过消除,找到与其他范围完全不相交的范围:
byqmnocz2#
我不确定
numpy
的情况,但pandas
的情况如下: