2017-11-21 3 views
0

私は以下の質問をします。私はこのような範囲のリストがあります:Python:リスト内のすべての要素が特定の時刻に存在するかどうかを確認します

parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)] 

をそして私はこのようなnumpyの配列があります。

arr = np.array([[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0], 
[4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0], 
[2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0], 
[6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0], 
[8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0], 
[11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0], 
[1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0], 
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0]]) 

リスト内のすべてのparameterRangeタプルがnumpyの配列の部分配列に対応します。対応する範囲内のすべての要素が少なくとも1回存在するかどうかをチェックする方法はありますか?たとえば、numpy配列の最初のサブリストでは、1,2,3,4,5のすべてが少なくとも1回存在し、2番目のサブリストは1回存在し、thirrdリストには1,2,3などの数が存在します、4,5,6,7が1回など存在する。

+1

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.histogram.htmlが –

答えて

2

範囲は整数我々はarrの形状である、n×m個のO(nm)の溶液を得ることができていることを活用します。

  • 廃棄効率的に(O(MN))で、範囲の数値のためのbincountsを生成し
  • カウントする彼らの範囲外
  • 使用np.add.atているすべての非int型の要素とすべてを次のようにアルゴ作品各行の閾値ビンを上回り、範囲と比較して

と比較してください。

import numpy as np 

parameterRanges2 = np.array([(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)]) 

arr = np.array([[2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0], 
[4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0], 
[2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0], 
[6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0], 
[8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0], 
[11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0], 
[1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0], 
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0]]) 

min_occ = 2 

dp = np.diff(parameterRanges2, axis=-1) 
m = np.zeros((parameterRanges2.shape[0], np.max(dp) + 2), dtype=int) 
arr = arr - parameterRanges2[:, :1] 
ia = arr.astype(int) 
idx = np.where((arr==ia) & (ia>=0) & (ia<=dp), ia, -1) 
np.add.at(m, (np.arange(parameterRanges2.shape[0])[:, None], idx), 1) 
res = (m[:, :-1] >= min_occ).sum(axis=-1) == dp.ravel() + 1 
print(res) 

出力:

[ True True False True False False True True] 
+0

いいですね、範囲内の数字は少なくとも2回または3回辿るべきでしょうか? – Varlor

+0

@Varlor 'np.add.at'を使ってできるはずです。 –

+0

@ヴァーラーは働くようです、plsは更新された投稿を見ます。 –

0

Numpy関数を使用するとより効率的な方法があるかもしれませんが、以下のコードは機能します。私はrangesというNumpyの標準的な配列を作ることができないので、単純なナンシーな方法を考えることはできません。すべての行が同じ長さではないからです。

import numpy as np 

arr = np.array([ 
    [2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0,1.0,3.0,2.0,4.0,2.0,4.0,3.0,5.0], 
    [4.0,2.0,3.0,4.0,2.0,4.0,5.0,1.0,2.0,4.0,1.0,3.0,4.0,2.0,3.0,5.0,1.0,3.0,4.0,2.0], 
    [2.0,3.0,4.0,6.0,7.0,1.0,2.0,3.0,5.0,6.0,1.0,2.0,4.0,5.0,6.0,2.0,3.0,4.0,5.0,6.0], 
    [6.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,2.0,2.0,3.0,4.0,5.0], 
    [8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,7.0,8.0,9.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0], 
    [11.0,13.0,14.0,16.0,17.0,19.0,1.0,3.0,4.0,6.0,7.0,9.0,10.0,11.0,13.0,14.0,16.0,17.0,19.0,1.0], 
    [1.0,1.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,1.0,1.0,1.0,1.0,1.0,2.0], 
    [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0] 
]) 

parameterRanges2 = [(1,5),(1,5),(1,7),(1,7),(0,10),(1,20),(1,3),(0,1)] 
ranges = [np.arange(u, v+1, dtype='float64') for u, v in parameterRanges2] 

print([np.all(np.isin(u,v)) for u, v in zip(ranges, arr)]) 

出力

[True, True, True, True, False, False, True, True] 
+0

[OK]を素敵に役立つ可能性があり、範囲内の数字が少なくとも2倍または3倍になると言う可能性もありますか? – Varlor

関連する問題