2015-10-21 13 views
5

Yalnızca -1 veya 1'den oluşan girişleri içeren bir dizi düşünün. Yalnızca 1 ve en az uzunluk olan t'u içeren tüm dilimlerin aralıklarını nasıl alabilirim (örn. t=3)numpe dizisinde minimum uzunluktaki aynı girdiler dizilerinin aralıklarını alma

Örnek:

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

Daha sonra, t=3 için arzu edilen çıkış [(2,7),(11,15)] olacaktır. np.diff ve np.where kullanılarak

cevap

3

Bir yaklaşım -

# 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

@corinna İlginç, hiç sorun değil! – Divakar

0

çok iyi numpy bilmiyorum ama basit işlevini kullanmak daha iyi olmaz mı?

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 
İlgili konular