2015-10-21 6 views
5

विशेष रूप से -1 या 1 वाली प्रविष्टियों वाली एक सरणी पर विचार करें। मैं सभी स्लाइसों की श्रेणियों को 1 विशेष रूप से और न्यूनतम लंबाई t (उदाहरण के लिए) कैसे प्राप्त करूं t=3)एक समान राशि के साथ समान प्रविष्टियों के अनुक्रमों की श्रेणियां प्राप्त करना

उदाहरण:

>>>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.diff और np.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

@corinna दिलचस्प था, इसलिए कोई समस्या नहीं थी! – 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 
संबंधित मुद्दे