2015-09-24 6 views
6

मैं अजगर (और यहां तक ​​कि प्रोग्रामिंग!) पर नया हूं, इसलिए मैं अपने प्रश्न को समझाने के लिए जितना स्पष्ट हो सकता हूं उतना स्पष्ट होने की कोशिश करूंगा। आपके लिए यह आसान हो सकता है, लेकिन मुझे अभी तक एक संतोषजनक परिणाम नहीं मिला है। ,एक पायथन सरणी में केवल लगातार मूल्यों का सारांश

x = numpy.array([1, 4, 2, 3, -1, -6, -6, 5, 6, 7, 3, 1, -5, 4, 9, -5, -2, -1, -4]) 

मैं केवल नकारात्मक मानों निरंतर हैं योग करने के लिए करना चाहते हैं:

मैं दोनों नकारात्मक और सकारात्मक मूल्यों के साथ एक सरणी है, कहते हैं:

यहाँ समस्या है यानी केवल योग (-1, -6, -6), योग (-5, -2, -1, -4) और इसी तरह। मैंने numpy का उपयोग करने का प्रयास किया है।, साथ ही numpy.split स्थिति के आधार पर।

उदाहरण के लिए:

for i in range(len(x)): 
    if x[i] < 0.: 
     y[i] = sum(x[i]) 

लेकिन, जैसा कि आप उम्मीद कर सकते हैं, मैं सिर्फ सभी नकारात्मक मूल्यों का योग सरणी में बजाय मिला है। इस मामले में योग (-1, -6, -6, -5, -5, -2, -1, -4) क्या लोग इस समस्या को हल करने के लिए मेरे साथ एक सौंदर्य और कुशल तरीका साझा कर सकते हैं? मैं इस पर किसी भी प्रतिक्रिया की सराहना करता हूं।

आपको बहुत बहुत धन्यवाद

+4

अपेक्षित आउटपुट क्या है? –

+0

क्या आप केवल 'numpy' समाधान या शुद्ध पायथन समाधान की तलाश में हैं? – Akavall

+0

मेरे लिए यह एक पायथनिक समाधान के साथ ठीक है। मैं Kasramvd सलाह का पालन करने की कोशिश कर रहा हूँ। हालांकि, अगर आप इसे इटरटोल का उपयोग करने के अलावा एक अन्य विकल्प की सलाह देते हैं, तो यह भी ठीक होगा। – hurrdrought

उत्तर

1

यहाँ एक vectorized NumPythonic समाधान है

mask1 = np.convolve(mask.astype(int),np.ones(3),'same')>1 

आप प्रत्येक "द्वीप" में ऋणात्मक संख्याओं की गिनती प्राप्त कर सकते हैं मौजूदा कोड के लिए थोड़ा tweak के साथ -

counts = np.bincount(id[mask1]-1) 

सा मैपल रन -

In [395]: x 
Out[395]: 
array([ 1, 4, 2, 3, -1, -6, -6, 5, 6, 7, 3, 1, -5, 4, 9, -5, -2, 
     -1, -4]) 

In [396]: out 
Out[396]: array([-13., -12.]) 

In [397]: counts 
Out[397]: array([3, 4]) 
+0

बहुत बहुत धन्यवाद! मैं भी अच्छे परिणामों के साथ इस विकल्प का प्रयास कर रहा हूं। यह अच्छा है क्योंकि मैं देख सकता हूं कि मैंने कितनी संख्याएं जोड़ दी हैं (यानी मायने रखती हैं)। – hurrdrought

+0

मैं आपको यह बताने के लिए चाहता था कि, आपकी पोस्ट के लिए धन्यवाद, मैंने (लगभग) अपना प्रोग्राम समाप्त कर लिया है। मुझे यह करने के लिए वास्तव में यह सरल लेकिन कुशल तरीका पसंद है। आपका बहुत बहुत धन्यवाद। – hurrdrought

+2

@hurrdrought बहुत बढ़िया! मुझे लगता है कि यह समाधान प्रदर्शन के संदर्भ में कुशल होने के कारण होगा क्योंकि इससे लूप से बचा जाता है और यही वह जगह है जहां न्यूमपी आधारित समाधान चमकते हैं। क्या आप अपने डेटासेट के लिए इन दृष्टिकोणों को भी समय देने में सक्षम थे? – Divakar

7

आप itertools मॉड्यूल, groupby का उपयोग कर आप उन पर हस्ताक्षर के आधार पर अपने आइटम समूहीकरण कर सकते हैं के साथ यहाँ का उपयोग फिर जांच अगर यह key समारोह में शर्त को पूरा तो यह है सकते हैं ऋणात्मक संख्याओं तो उपज किसी और योग यह उपज और आखिरी में आप परिणाम श्रृंखला के लिए chain.from_iterable फ़ंक्शन का उपयोग कर सकते हैं:

:

>>> from itertools import groupby,tee,chain 
>>> def summ_neg(li): 
...  for k,g in groupby(li,key=lambda i:i<0) : 
...   if k: 
...    yield [sum(g)] 
...   yield g 
... 
>>> list(chain.from_iterable(summ_neg(x))) 
[1, 4, 2, 3, -13, 5, 6, 7, 3, 1, -5, 4, 9, -12] 

या एक अधिक pythonic तरीके के रूप में एक सूची समझ का उपयोग

# Mask of negative numbers 
mask = x<0 

# Differentiation between Consecutive mask elements. We would look for 
# 1s and -1s to detect rising and falling edges in the mask corresponding 
# to the islands of negative numbers. 
diffs = np.diff(mask.astype(int)) 

# Mask with 1s at start of negative islands 
start_mask = np.append(True,diffs==1) 

# Mask of negative numbers with islands of one isolated negative numbers removed 
mask1 = mask & ~(start_mask & np.append(diffs==-1,True)) 

# ID array for IDing islands of negative numbers 
id = (start_mask & mask1).cumsum() 

# Finally use bincount to sum elements within their own IDs 
out = np.bincount(id[mask1]-1,x[mask1]) 

तुम भी np.convolve उपयोग कर सकते हैं mask1 प्राप्त करने के लिए है, इसलिए की तरह - -

+0

आपको दो पुनरावृत्तियों की आवश्यकता नहीं है, बस जांचें कि '_' (i.e key) का मान' True' या 'गलत' है या नहीं। यदि यह 'सत्य' है तो यह सकारात्मक संख्याओं का एक समूह है। –

+0

@ अश्विनी चौधरी ओह हाँ, निश्चित रूप से, क्योंकि मैं हमेशा 'k' के बजाय' _' का उपयोग करता हूं, मैं बस इसका उपयोग भूल गया ;-) इसे याद दिलाने के लिए धन्यवाद! – Kasramvd

+0

@ Kasramvd, इस विकल्प के लिए आपको बहुत बहुत धन्यवाद। यह उम्मीद के रूप में काम कर रहा है। साथ ही, क्या आप उन नकारात्मक मूल्यों के योग को जानने का तरीका जानते हैं लेकिन यह जानकर कि कितने नंबर (यानी उन हिस्सों का आकार) जोड़ा गया था? मुझे पता है कि यह जटिल हो सकता है। अग्रिम में धन्यवाद। – hurrdrought

1

आप नकारात्मक मूल्यों को ध्वजांकित कर सकते हैं ....और सादे अजगर के साथ ऐसा कर

prev = False 

    for i,v in enumerate(a): 
      j = i + 1  
      if j < len(a): 
       if a[i] < 0 and a[j] < 0: 
        temp.append(v) 
        prev = True 
       elif a[i] < 0 and prev: 
        temp.append(v) 
        prev = True 
       elif a[i] > 0: 
        prev = False 
      else: 
       if prev and v < 0: 
        temp.append(v) 

उत्पादन

प्रिंट (अस्थायी)

[-1, -6, -6, -5, -2, -1, -4]

intertools साथ

मैं सिर्फ इतना है कि

def sum_conseq_negative(li): 
    neglistAll = [] 
    for k, g in groupby(li, key=lambda i:i<0): 
     negList = list(g) 
     if k and len(negList) > 1: 
      neglistAll.extend(negList) 
    return sum(negList), len(negList) 

sumOf, numOf = sum_conseq_negative(li) 

print("sum of negatives {} number of summed {}".format(sumOf,numOf)) 

नकारात्मक का योग करना होगा -25 की संख्या संक्षेप में 7

संबंधित मुद्दे