2016-10-10 13 views
0

私はpythonと範囲内の要素の選択に関する質問があります。Python - 範囲内の行列から要素を選択してください

n行m列のn x m行列を持つ場合、各列に定義された範囲があります(したがって、最小値と最大値があります)。

ここで、すべての値が範囲内にある行を選択します。

次の例を見てみる:ここ

input = matrix([[1, 2], [3, 4],[5,6],[1,8]]) 
boundaries = matrix([[2,1],[8,5]]) 
#Note: 
#col1min = 2 
#col1max = 8 
#col2min = 1 
#col2max = 5 
print(input) 

desired_result = matrix([[3, 4]]) 
print(desired_result) 

、彼らは境界を越えた値が含まれているため、廃棄された3行。

特定の配列で1つの範囲内の値を取得することはできましたが、効率的にこの問題を解決することはできませんでした。

ありがとうございました。

+0

あなたの質問を簡単に説明してください! –

答えて

0

私は、よりエレガントな解決策があることを信じて、私はこれに来た:

def foo(data, boundaries): 
    zipped_bounds = list(zip(*boundaries)) 
    output = [] 
    for item in data: 
     for index, bound in enumerate(zipped_bounds): 
      if not (bound[0] <= item[index] <= bound[1]): 
       break 
     else: 
      output.append(item) 
    return output 

data = [[1, 2], [3, 4], [5, 6], [1, 8]] 
boundaries = [[2, 1], [8, 5]] 
foo(data, boundaries) 

出力:

[[3, 4]] 

と私はそこにチェックし、例外を上げていないことがわかっている場合のサイズ配列は各コンクリートサイズに一致しません。私はこれを実装するためにOPを残す。

0

あなたの例のデータの構文は、それはこのように再構築する必要がmatrix([[],..])正しくありません:

matrix = [[1, 2], [3, 4],[5,6],[1,8]] 
bounds = [[2,1],[8,5]] 

私は、あなたが「効率的」の意味を正確にわからないんだけど、このソリューションは、計算効率、読み取り可能です、およびモジュラー:

# Test columns in row against column bounds or first bounds 
def row_in_bounds(row, bounds): 
    for ci, colVal in enumerate(row): 
     bi = ci if len(bounds[0]) >= ci + 1 else 0 
     if not bounds[1][bi] >= colVal >= bounds[0][bi]: 
      return False 
    return True 

# Use a list comprehension to apply test to n rows 
print ([r for r in matrix if row_in_bounds(r,bounds)]) 
>>>[[3, 4]] 

まず、我々は境界のリストのリストを受け入れる行の再利用可能なテスト機能を作成するには、タプルはおそらく、より適切であるが、私はあなたの仕様に従ってリストで立ち往生。

次に、n個の行のマトリックスにリストの理解度を適用してテストを適用します。 nが境界列インデックスを超えている場合、または境界列インデックスがfalseの場合、提供されている境界の最初のセットを使用します。

行パーサー関数から行イテレーターを保持すると、必要に応じてフィルタリングされた要素からmin/maxを取得するなどの作業を行うことができます。この方法では、必要なデータを操作するたびに新しい関数を定義する必要はありません。

関連する問題