簡體   English   中英

如何使用 python 計算 2 個范圍之間的重疊百分比

[英]How to calculate the percentage of overlap between 2 ranges with python

我想計算 2 個范圍之間的重疊百分比。

例如:我有兩個列表 x 和 yx ['567.630', '592.927'] y ['593.000', '618.297'] 在這種情況下我想要一個 output 的 0 因為沒有重疊。

x ['793.843', '802.244'] y ['794.843', '803.244'] 在這種情況下,我想要 87% 的 output。

x 和 y 的總范圍並不總是相同。 可能是 x 是 10s 而 y 只是 8s。

會不會有一些包可以執行這些計算?

先感謝您!

這是一個更短的解決方案,您可以在其中選擇要比較重疊的列表。 如果您希望 [0,1] 和 [0,2] 的重疊為 100%,您可以從 output 中執行 max(x,y)。我更改了 y 列表以顯示這一點。

x = [793.843, 802.244]

y = [794.843, 900.244] 


def overlap_percentage(xlist,ylist):
    min1 = min(xlist)
    max1 = max(xlist)
    min2 = min(ylist)
    max2 = max(ylist)

    overlap = max(0, min(max1, max2) - max(min1, min2))
    length = max1-min1 + max2-min2
    lengthx = max1-min1
    lengthy = max2-min2

    return 2*overlap/length , overlap/lengthx  , overlap/lengthy 

 average, x,y = overlap_percentage(x,y)
    
 print("average: ", average*100,"%    x: ", x*100,"%    y: ",y*100,"%")

output

average:  13.0 %    x:  88.0%    y:  7.0 %

不需要額外的進口。 我假設數據是float列表而不是字符串。 該百分比計算為與第二個間隔重疊,對於另一種情況,請取消注釋實施中的行。

def overlapping_percentage(interval1: list, interval2: list) -> int:
    # min max of each intervals
    m1, M1 = min(interval1), max(interval1)
    m2, M2 = min(interval2), max(interval2)

    # find overlapping boundaries
    lb, ub = 0, 0 # lower and upper bound
    if m1 <= m2 <= M1:
        if M1 >= M2:    # i2 is contained in i1
            lb, ub = m2, M2
        elif M1 < M2:
            lb, ub = m2, M1

    elif m2 <= m1 <= M2:
        if M1 <= M2:    # i1 is contained in i2
            lb, ub = m1, M1
        elif M1 > M2:
            lb, ub = m1, M2

    # percentage
    percent = int((ub - lb) / (interval2[1] - interval2[0]) * 100)
    # percent = int((ub - lb) / (interval1[1] - interval1[0]) * 100) # for the other percentage uncomment this line
    print('overlapping interval', lb, ub)
    print(percent, '%')
    
    return percent


# intervals
#i1, i2 = [567.630, 592.927], [593.000, 618.297]
i1, i2 = [793.843, 802.244], [794.843, 803.244]

overlapping_percentage(i1, i2)
# overlapping interval 794.843 - 802.244
# 88 %

重疊部分可以進一步壓縮如下

    ...
    # find overlapping boundaries
    lb, ub = 0, 0 # lower and upper bound
    if m1 <= m2 <= M1:
        lb, ub = m2, min(M1, M2)
    elif m2 <= m1 <= M2:
        lb, ub = m1, min(M1, M2)
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM