在 python 中的连续值范围内取交集
taking intersection over a continous range of values in python
我有一个要在其上取交集的值域。
例如。 0 <= n1 < 2*pi 和 -pi <= n2 < pi 现在 n1 交集 n2 将是 [0,pi)。 n1 和 n2 的范围可以是任何值。我想知道是否有一种简单的方法可以做到这一点。我目前正在使用嵌套的 if-else 来执行此操作。我也想知道如果没有重叠,他们的交集是否为空
这是一个变体:
from dataclasses import dataclass
@dataclass(frozen=True)
class Range:
frm: float
to: float
# assert frm <= to
def intersect(ranges):
if ranges[0].to < ranges[1].frm or ranges[1].to < ranges[0].frm:
# no overlap
return None
return Range(frm=max(ranges[0].frm, ranges[1].frm),
to=min(ranges[0].to, ranges[1].to))
print(intersect((Range(frm=0, to=2), Range(frm=-1, to=1))))
# -> Range(frm=0, to=1)
我使用了 dataclass
以便更清楚地说明这里发生了什么。请注意,对于 Range
我假设不变量 frm <= to
.
摆脱嵌套 if
在模块 sympy
中有一个 class Set
和几个子 class,包括 Interval
.
from sympy import Interval, Intersection, pi
n1 = Interval.Ropen(0, 2*pi)
n2 = Interval.Ropen(-pi, pi)
n3 = Intersection(n1, n2)
print(n3)
# Interval.Ropen(0, pi)
相关文档:sympy Sets
我有一个要在其上取交集的值域。 例如。 0 <= n1 < 2*pi 和 -pi <= n2 < pi 现在 n1 交集 n2 将是 [0,pi)。 n1 和 n2 的范围可以是任何值。我想知道是否有一种简单的方法可以做到这一点。我目前正在使用嵌套的 if-else 来执行此操作。我也想知道如果没有重叠,他们的交集是否为空
这是一个变体:
from dataclasses import dataclass
@dataclass(frozen=True)
class Range:
frm: float
to: float
# assert frm <= to
def intersect(ranges):
if ranges[0].to < ranges[1].frm or ranges[1].to < ranges[0].frm:
# no overlap
return None
return Range(frm=max(ranges[0].frm, ranges[1].frm),
to=min(ranges[0].to, ranges[1].to))
print(intersect((Range(frm=0, to=2), Range(frm=-1, to=1))))
# -> Range(frm=0, to=1)
我使用了 dataclass
以便更清楚地说明这里发生了什么。请注意,对于 Range
我假设不变量 frm <= to
.
if
在模块 sympy
中有一个 class Set
和几个子 class,包括 Interval
.
from sympy import Interval, Intersection, pi
n1 = Interval.Ropen(0, 2*pi)
n2 = Interval.Ropen(-pi, pi)
n3 = Intersection(n1, n2)
print(n3)
# Interval.Ropen(0, pi)
相关文档:sympy Sets