2012-04-26 33 views
60

में ऋणात्मक मानों को प्रतिस्थापित करता है क्या कोई भी सभी नकारात्मक मानों को 0 के साथ सरणी में बदलने का एक आसान तरीका सुझा सकता है?numpy सरणी

मैं कैसे एक numpy सरणी

उदा का उपयोग कर यह करने के लिए पर एक पूरा ब्लॉक हो रही है

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

मैं

[1, 2, 3, 0, 5] 

a < 0 वापस जाने के लिए आवश्यक होते हैं:

[False, False, False, True, False] 

यह मैं कहाँ अटक कर रहा हूँ है - कैसे इस सरणी का उपयोग करने के मूल सरणी को संशोधित करने के

उत्तर

93

आप वहां आधा रास्ते हैं। आज़माएं:

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

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

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

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

+1

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

+1

@Hiett - मैंने अभी कोशिश की और क्लिप एक ले जाएगा। पहले न्यूनतम माना जाता है। – Usagi

+0

numpy के साथ एक संस्करण मुद्दा होना चाहिए - मेरा ouptut heres: (पीडीबी) एनपी।क्लिप (, डब्ल्यू 0) *** लेखन त्रुटि: क्लिप() कम से कम 3 तर्क (2 दिए गए) लेता है - जबकि: (PDB) np.clip (डब्ल्यू, 0,1e6) सरणी ([[0, 0.605] ]) – bph

2

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

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

इस मार्ग नीचे चला गया लेकिन सोचा था वहाँ होना चाहिए एक आसान, और अधिक कम अजगर रास्ते numpy के साथ यह करने के लिए (matlab के रूप में मैं उपयोग कर रहा था वैसे भी सूचियों के बजाय सरणी)। क्लिप सही है – bph

8

एक और minimalist पायथन समाधान numpy का उपयोग किए बिना:

[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] 
+0

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

+0

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

+0

@Usagi इस प्रश्न के पहले गलत गलती को इंगित करने के लिए धन्यवाद, मैंने कोड को सही किया। – Levon

3

और फिर भी एक और संभावना:

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

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