2015-02-17 8 views
14

के बिना एक numpy सरणी monotonic बनाओ मेरे पास 1 डी सरणी मान है जो मोनोटोनिक (चलो कहने में कमी) माना जाता है, लेकिन यादृच्छिक क्षेत्र हैं जहां सूचकांक के साथ मूल्य बढ़ता है।पाइथन लूप

मुझे एक सरणी की आवश्यकता है जहां प्रत्येक क्षेत्र को सीधे इसके पहले मान के साथ प्रतिस्थापित किया गया हो, जिससे परिणामी सरणी क्रमबद्ध हो।

तो अगर दिया सरणी है:

a = np.array([10.0, 9.5, 8.0, 7.2, 7.8, 8.0, 7.0, 5.0, 3.0, 2.5, 3.0, 2.0]) 

मैं परिणाम

b = np.array([10.0, 9.5, 8.0, 7.2, 7.2, 7.2, 7.0, 5.0, 3.0, 2.5, 2.5, 2.0]) 

होना चाहता हूँ यहाँ एक चित्रमय प्रतिनिधित्व है:

example

मुझे पता है कि यह कैसे प्राप्त करने के लिए पाइथन लूप के साथ, लेकिन NumPy के साथ ऐसा करने का कोई तरीका है मशीनरी? स्पष्टता के लिए

अजगर कोड:

b = np.array(a) 
for i in range(1, b.size): 
    if b[i] > b[i-1]: 
     b[i] = b[i-1] 
+0

"बिना लूप के" चिंता क्यों? चाहे आप एक स्पष्ट लूप लिखते हों, या लूप कुछ मॉड्यूल/पैकेज से आयातित फ़ंक्शन में किया जाता है, यह अभी भी वहां है। ऐसे मूल्यों की श्रृंखला में कुछ करने के बहुत सारे तरीके नहीं हैं जिनमें लूप शामिल न हो, जब तक कि आप पूरे लूप को संचालन के रैखिक अनुक्रम में पूरी तरह से अनलॉक नहीं करना चाहते हैं, जो कई अलग-अलग कारणों से बदसूरत है - पोर्टेबिलिटी, लचीलापन , कोड आकार, आदि ... – twalberg

+0

@twalberg मुझे लगता है कि NumPy का उपयोग करते समय पाइथन लूप से बचने के लिए आम बात है, क्योंकि सी में लागू कार्यों के भीतर पुनरावृत्ति को सामान्य रूप से किया जाता है, तो प्रदर्शन आमतौर पर सुधारता है। यह अक्सर होता है कि कोड है छोटा क्लीनर –

+0

बड़े डेटा सेट के साथ काम करते समय यह एक वैध बिंदु है। हालांकि, इस उदाहरण में (और किसी भी संकेत के बिना कि "असली" समस्या परिमाण की बड़ी संख्या है), मुझे लगता है कि पाइथन सूची को डेटा संरचना में परिवर्तित करने के ऊपरी हिस्से में सी लूप काम कर सकता है, और उसके बाद इसे वापस परिवर्तित कर सकता है उपयुक्त पायथन डेटा संरचना, शायद एक दर्जन प्रविष्टियों को फिर से शुरू करने के लिए केवल पाइथन लूप का उपयोग न करने से किसी भी संभावित लाभ को व्यक्त करता है ... यह सत्यापित करने के लिए बेहतर है कि लूप केवल इसे खत्म करने की कोशिश करने से पहले एक समस्या है ... – twalberg

उत्तर

16

आप np.minimum.accumulate उपयोग कर सकते हैं के रूप में आप सरणी के माध्यम से चलते न्यूनतम मान एकत्र करने के:

>>> np.minimum.accumulate(a) 
array([ 10. , 9.5, 8. , 7.2, 7.2, 7.2, 7. , 5. , 3. , 
     2.5, 2.5, 2. ]) 

सरणी में प्रत्येक तत्व के आधार पर इस फ़ंक्शन अब तक न्यूनतम मूल्य देखा गया है।

यदि आप एक सरणी को monotonic बढ़ाना चाहते थे, तो आप np.maximum.accumulate का उपयोग कर सकते हैं।

न्यूमपी में कई अन्य सार्वभौमिक कार्यों में accumulate विधि है जो एक सरणी के माध्यम से लूपिंग अनुकरण करने के लिए, प्रत्येक तत्व को फ़ंक्शन लागू करने और लौटाए गए मानों को उसी आकार की सरणी में एकत्रित करने के लिए होती है।

+1

वाह। मुझे 'accumulate' के बारे में पता नहीं था! यह पाइथन 2 'कम' (या पायथन 3 'functools.reduce') के बहुत करीब है, क्या मैं सही हूँ? –

+1

यह बहुत समान है - प्रत्येक संग्रह पर ऑपरेशन के परिणाम को संग्रहित करता है, प्रत्येक तत्व पर एक ही लंबाई की सरणी लौटाता है, जबकि unfunc ['reduce'] (http://docs.scipy.org/doc/numpy/reference/ जेनरेट/numpy.ufunc.reduce.html) विधि केवल अंतिम परिणाम दिखाती है (सरणी को ध्वस्त कर रहा है)। –

+0

ओह हाँ, आप सही हैं।इसलिए 'कम करें' मूल रूप से 'जमा' रिटर्न के अंतिम तत्व को वापस कर देगा। –

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