2016-10-23 9 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 haha​​、あなたはポイントがあります:) –

+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]) 

例(パイソン2):Pythonの3では

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

、戻り値ではなく、リストの遅延zip()対象となります。あなたはlist()への呼び出しをapply_boolean_function()のreturn文に追加して、代わりにリストを得ることができます。

関連する問題