2015-10-21 4 views
5

-1または1のみのエントリを持つ配列を考えてみましょう.1を含むすべてのスライスの範囲を最小の長さのt(たとえばt=3numpyの配列で最小の長さの同じエントリのシーケンスの範囲を取得する

例:

>>>a=np.array([-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1], dtype=int) 
>>> a 
array([-1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1]) 

そして、t=3に対する所望の出力が[(2,7),(11,15)]あろう。 np.diffnp.where使用

答えて

3

一つのアプローチ -

# Append with `-1s` at either ends and get the differentiation 
dfa = np.diff(np.hstack((-1,a,-1))) 

# Get the positions of starts and stops of 1s in `a` 
starts = np.where(dfa==2)[0] 
stops = np.where(dfa==-2)[0] 

# Get valid mask for pairs from starts and stops being of at least 3 in length 
valid_mask = (stops - starts) >= 3 

# Finally collect the valid pairs as the output 
out = np.column_stack((starts,stops))[valid_mask].tolist() 
+0

@コリンナ興味深いので全く問題はありませんでした。 – Divakar

0

は非常によくnumpyのか分からないのですが、簡単な関数を使用する方が良いのではないでしょうか?

def slices(a, t): 
    start = None 
    i = 0 # index into array 
    slices = [] 
    for val in a: 
     if a[i] == 1: # start of sequence 
      if start is None: 
       start = i 
     else: # -1 end of sequence 
      if start is not None: 
       if i - start >= t: # check sequence for minimum size 
        slices.append((start, i)) 
       start = None 
     i += 1 

    # if sequence of 1's doesn't end with -1 within array 
    if start is not None: 
     if i - start >= t: 
      slices.append((start, i)) 

    return slices 
関連する問題