2017-05-24 8 views
2

私は同じ長さの2つの配列を持っています。最初の配列はブール値の配列で、2番目の配列は対応する値を含んでいます。bool pythonによる配列の部分の中央値の取得

flag = [0,0,0,1,1,0,0,0,1,1,1,1,0,1,1] 
values = [1,5,6,8,5,6,2,0,1,9,3,8,3,6,2] 

ブール値行列の各部分に対応する中央値を含む中央値の配列を返したいとします。

flag = [0,0,0,1, 1, 0,0,0, 1, 1, 1, 1, 0,1,1] 
result = [0,0,0,6.5,6.5,0,0,0,5.5,5.5,5.5,5.5,0,4,4] 

私unestheticアプローチが行うことです。

result = np.zeros(values.shape[0]) 
vect = [] 
idx = [] 
for n in np.arange(result.size): 
    if flag[n] > 0: 
     vect.append(values[n]) 
     idx.append(n) 
    elif flag[n] == 0: 
     result[idx] = np.median(vect) 
     vect = [] 
     idx = [] 
    result[idx] = np.median(vect) 

それはうまく動作しますが、私は非常に大きな配列を扱うので、それは非常にニシキヘビと非常に遅いではありません。

答えて

2

np.diffを使用して0と1の間のトランジションを見つけることができます。次に、0/1と1/0のトランジションのペアをループし、中間のすべての値から中央値を取ってください。

結果のループは1の各グループを繰り返します。

flag = [0,0,0,1,1,0,0,0,1,1,1,1,0,1,1] 
values = [1,5,6,8,5,6,2,0,1,9,3,8,3,6,2] 

d = np.diff(np.concatenate([[0], flag, [0]])) # Add and append a 0 so the procedure also works if flags start or end with 1. 

begin = np.flatnonzero(d==1) 
end = np.flatnonzero(d==-1) 

result = np.zeros_like(values, dtype=float) 

for a, b in zip(begin, end): 
    result[a:b] = np.median(values[a:b]) 

print(result) 
# [ 0. 0. 0. 6.5 6.5 0. 0. 0. 5.5 5.5 5.5 5.5 0. 4. 4. ] 
+0

この問題は明らかです。 – Divakar

+0

ありがとう! 10 000要素配列の場合、約100倍高速です。 –

関連する問題