2016-10-23 32 views
1

我需要收集有关浮点变量近似值的多条信息。信息看起来像“39 < x < 41”或只是“x < 14.4”。此外,该变量具有最终的最小值和最大值。是否有标准的Python类在浮点范围上执行布尔运算?

我想要一个包含浮点间隔形式的信息的类。我也想在这样的时间间隔执行布尔运算,使其看起来像:

float_interval(1,5) and float_interval(2,6) == float_interval(2,5) 
float_interval(1,2) and float_interval(3,4) == None 
float_interval(1,2) or float_interval(3,4) == i_do_not_know_yet 

上午我介绍一些知名的类或我将它写自己?

如果有人对这个变量感兴趣,那么怀孕期间的周胎儿胎龄。在许多病例对照研究中,胎儿​​的年龄并不总是直接提及,而是有孕期或早产的分娩或早产等信息。因此,我可以推断出大概的孕龄并将其归入相应的类别。

+0

有一个名为[intervaltree]的软件包(https://pypi.python.org/pypi/intervaltree/2.1.0),它允许您有效地对间隔执行一些操作。它已经有一段时间没有更新,但它可以为你工作,或给你一个暗示寻找什么。 –

+0

@zvone哈哈,你有一个点:) –

+0

标准库中没有这样的类。正如你最后一个例子所显示的那样,这个班级必须代表有限的时间间隔。实现起来相对简单,但会受到浮点数固有的精度限制。 –

回答

3

非常有能力的sympy包有Interval类内置。示例代码:

import sympy 
I1 = sympy.Interval(1, 5) 
I2 = sympy.Interval(2, 6) 
I3 = I1 & I2 
print(I3) 

有关详细信息,请参阅sympy interval documentation

2

下面是一个简单的概念验证逻辑实现,将布尔函数应用于有限的区间联合。有限的区间联合表示为(开始,结束)对的列表。

import functools 
import heapq 
import itertools 

def iter_intervals(tag, interval_set): 
    for start, end in interval_set: 
     yield start, tag, True 
     yield end, tag, False 

def apply_boolean_function(f, *interval_sets): 
    states = [False] * len(interval_sets) 
    result_state = False 
    result = [] 
    for boundary, index, new_state in heapq.merge(*itertools.starmap(
      iter_intervals, enumerate(interval_sets))): 
     states[index] = new_state 
     new_result_state = f(states) 
     if new_result_state != result_state: 
      result_state = new_result_state 
      if new_result_state and result and result[-1] == boundary: 
       result.pop() 
      else: 
       result.append(boundary) 
    return zip(*[iter(result)] * 2) 

union = functools.partial(apply_boolean_function, any) 
intersection = functools.partial(apply_boolean_function, all) 
complement = functools.partial(apply_boolean_function, 
           lambda states: not states[0] and states[1]) 

实例(Python的2):

>>> union([(2, 4), (6, 8)], [(5, 7)]) 
[(2, 4), (5, 8)] 
>>> intersection([(1, 5)], [(2, 6)]) 
[(2, 5)] 

在Python 3,返回值将是一个懒惰zip()对象,而不是一个列表。您可以将拨打list()的电话添加到apply_boolean_function()中的返回语句中,以获取列表。