ऋणात्मक मानों को सुन्न सरणी में बदलें


90

0 के साथ किसी सरणी में सभी नकारात्मक मानों को प्रतिस्थापित करने का एक सरल तरीका है?

मैं कैसे एक NumPy सरणी का उपयोग कर रहा है पर एक पूर्ण ब्लॉक कर रहा हूँ।

उदाहरण के लिए

a = array([1, 2, 3, -4, 5])

मुझे लौटने की जरूरत है

[1, 2, 3, 0, 5]

a < 0 देता है:

[False, False, False, True, False]

यह वह जगह है जहां मैं फंस गया हूं - मूल सरणी को संशोधित करने के लिए इस सरणी का उपयोग कैसे करें।

जवाबों:


137

तुम वहाँ आधी हो। प्रयत्न:

In [4]: a[a < 0] = 0

In [5]: a
Out[5]: array([1, 2, 3, 0, 5])

89

कोशिश करें numpy.clip:

>>> import numpy
>>> a = numpy.arange(-10, 10)
>>> a
array([-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,
         3,   4,   5,   6,   7,   8,   9])
>>> a.clip(0, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

आप केवल नीचे के आधे भाग को ही क्लिप कर सकते हैं clip(0)

>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])

आप केवल शीर्ष आधा के साथ क्लिप कर सकते हैं clip(max=n)। (यह मेरे पिछले सुझाव से बहुत बेहतर है, जिसमें NaNपहले पैरामीटर से गुजरना और outप्रकार का उपयोग करना शामिल है।)

>>> a.clip(max=2)
array([ 1,  2,  2, -4,  2])

एक और दिलचस्प दृष्टिकोण का उपयोग करना है where:

>>> numpy.where(a <= 2, a, 2)
array([ 1,  2,  2, -4,  2])

अंत में, ऐक्स के उत्तर पर विचार करें । मैं clipसरल कार्यों के लिए पसंद करता हूं क्योंकि यह स्व-दस्तावेजीकरण है, लेकिन अधिक जटिल कार्यों के लिए उनका जवाब बेहतर है।


1
a.clip (0) पर्याप्त होगा क्योंकि ओपी केवल नकारात्मक मूल्यों को बदलना चाहता है। a.clip (0, 10) 10 से ऊपर कुछ भी बाहर नहीं करेगा
Usagi

1
@ यह - मैंने अभी इसकी कोशिश की है और क्लिप एक लेगा। पहले मान लिया जाता है।
उस्गी

सुन्न के साथ एक संस्करण जारी किया जाना चाहिए - विधिपूर्वक मेरे ouptut: (Pdb) np.clip (w, 0) *** TypeError: क्लिप () कम से कम 3 तर्क (2 दिए गए) लेता है - जबकि: (Pdb) np.clip ( w, 0,1e6) सरणी ([[0., 0.605]])
bph

1
@ कैसे, किस संस्करण का numpy? तुमने क्लिप विधि की कोशिश की a? अंतर्निहित फ़ंक्शन numpy.clipमुझे एक ही त्रुटि देता है, लेकिन विधि नहीं है।
प्रेषिती

यिद यदि आप इसे उस तरह से कहते हैं जैसे यह काम करने के लिए लगता है, जैसे p w.clip (0) सरणी ([[0., 0.605]]) - कैसे कतार?
bph

10

सुन्न का उपयोग किए बिना एक और न्यूनतम पायथन समाधान:

[0 if i < 0 else i for i in a]

किसी भी अतिरिक्त कार्यों को परिभाषित करने की आवश्यकता नहीं है।

a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]

पैदावार:

[1, 2, 3, 0, 0, 6]

1
यह अच्छा है - मैं सोच रहा था कि वाक्यविन्यास क्या होगा यदि कथन को सूची समझ के अंदर रखा जाए - मैं इसे लूप के बाद चिपकाकर गलत हो रहा था और केवल दो मान वापस पा रहा था, उदाहरण के लिए [0, 0] सूची
bph

मैंने वैसा ही किया जब मैंने मूल रूप से सूची समझ के बारे में सीखा और अपनी समझ को परखने के लिए अलग-अलग चीजों की कोशिश कर रहा था - यह मेरे लिए लूप के बाद इसे लगाने के लिए अधिक सहज लग रहा था। अब, हालांकि, यह करता है :) इसे forसूची के हर तत्व पर लागू करने से पहले इसे डाल दिया जाता है, इसके बाद इसे लगाने का मतलब है कि शर्त पूरी होने पर ही यह परिणामी सूची में जाता है।
लेवोन

2
@ यह i < 0 ? 0 : iसूची सूची के अंदर टर्नरी ऑपरेटर ( सी में) का उपयोग कर रहा है । इसे साफ करने के लिए कोष्ठक लगाएं [(0 if i < 0 else i) for i in a]। अगर डालने के बाद सूची अभिव्यक्ति निर्माण के फिल्टर भाग का उपयोग कर रहा है। [(i) for i in a if i < 0]केवल उन वस्तुओं की सूची लौटाएगा जो शून्य से कम हैं।
पॉल एस

2
Numpy शक्तिशाली है क्योंकि यह संकलित c कोड द्वारा बहुत अधिक गणना करता है और इस प्रकार तेज होता है। इस विधि की तुलना दूसरों से करें, तो मुझे लगभग 10 गुना गति कारक अंतर (यह धीमा है) लगता है। सहज और पढ़ने में आसान होने के कारण, यह निश्चित रूप से कम्प्यूटेशनल रूप से गहन के लिए नहीं है।
रास्पेंसर


2

यहां बिना पाइपी के पायथन में इसे करने का एक तरीका है। एक ऐसा फंक्शन बनाएं जो आप चाहते हैं और एक सूची समझ, या मानचित्र फ़ंक्शन का उपयोग करें।

>>> a = [1, 2, 3, -4, 5]

>>> def zero_if_negative(x):
...   if x < 0:
...     return 0
...   return x
...

>>> [zero_if_negative(x) for x in a]
[1, 2, 3, 0, 5]

>>> map(zero_if_negative, a)
[1, 2, 3, 0, 5]

1
इस मार्ग से नीचे चला गया था, लेकिन सोचा कि वहाँ एक आसान, और अधिक matlab कम अजगर रास्ते के साथ यह करना होगा (जैसा कि मैं वैसे भी सूचियों के बजाय सरणियों का उपयोग कर रहा था)। क्लिप एकदम सही है
bf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.