существует встроенная функция для вычисления перекрытия между двумя дискретными интервалами, например. перекрытие между [10, 15] и [20, 38]? В этом случае перекрытие равно 0. Если [10, 20], [15, 20], перекрытие составляет 5.
Встроенная функция для вычисления перекрытия в Python
Ответ 1
Вы можете использовать max и min:
>>> def getOverlap(a, b):
... return max(0, min(a[1], b[1]) - max(a[0], b[0]))
>>> getOverlap([10, 25], [20, 38])
5
>>> getOverlap([10, 15], [20, 38])
0
Ответ 2
Проверьте pyinterval http://code.google.com/p/pyinterval/
import interval
x=interval.interval[10, 15]
y=interval.interval[20, 38]
z=interval.interval[12,18]
print(x & y)
# interval()
print(x & z)
# interval([12.0, 15.0])
Ответ 3
Вот хорошая функция от Aaron Quinlan chrom_sweep, модифицированная для вашего представления интервалов. Он возвращает число bp перекрытия, если они перекрываются, в противном случае он возвращает расстояние как отрицательное значение int.
def overlaps(a, b):
"""
Return the amount of overlap, in bp
between a and b.
If >0, the number of bp of overlap
If 0, they are book-ended.
If <0, the distance in bp between them
"""
return min(a[1], b[1]) - max(a[0], b[0])
Ответ 4
Просто написал это:
def overlap(interval1, interval2):
"""
Given [0, 4] and [1, 10] returns [1, 4]
"""
if interval2[0] <= interval1[0] <= interval2[1]:
start = interval1[0]
elif interval1[0] <= interval2[0] <= interval1[1]:
start = interval2[0]
else:
raise Exception("Intervals are not overlapping")
if interval2[0] <= interval1[1] <= interval2[1]:
end = interval1[1]
elif interval1[0] <= interval2[1] <= interval1[1]:
end = interval2[1]
else:
raise Exception("Intervals are not overlapping")
return (start, end)
def percentage_overlap(interval1, interval2):
"""
Given [0, 4] and [1, 10] returns 0.75
"""
try:
overlap = _overlap(interval1, interval2)
except Exception:
return 0.0
return (overlap[1] - overlap[0]) / (interval1[1] - interval1[0])