2012-12-13 16 views
36

भीतर तत्वों मैं नंबर की एक numpy सरणी है, उदाहरण के लिए,Numpy: सीमा

a = [1, 3, 5, 6, 9, 10, 14, 15, 56] 

मैं एक विशिष्ट सीमा के भीतर सभी तत्वों को खोजने के लिए चाहते हैं पाते हैं। उदाहरण के लिए, यदि सीमा (6, 10) है, तो जवाब होना चाहिए (3, 4, 5)। क्या ऐसा करने के लिए एक अंतर्निहित कार्य है?

+4

@ अश्विनी चौधरी ओपी इंडेक्स के बारे में बात कर रहा है। – 3lectrologos

+0

ए = एनपी.एरे ([1, 3, 5, 6, 9, 10, 14, 15, 56])। np.argwhere ((a> = 6) और (a <= 10)) – Abhishek

उत्तर

66

आप np.where उपयोग कर सकते हैं सूचकांक पाने के लिए और np.logical_and दो शर्तों सेट करने के लिए:

import numpy as np 
a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56]) 

np.where(np.logical_and(a>=6, a<=10)) 
# returns (array([3, 4, 5]),) 
+5

बीटीडब्ल्यू, वही एनपी.ऑनजेरो (np.logical_and (a> = 6, a <= 10)) द्वारा प्राप्त किया जाता है। – 3lectrologos

10

मैं मैं इस जोड़ना होगा सोचा क्योंकि उदाहरण में a आप दे दी क्रमित है:

import numpy as np 
a = [1, 3, 5, 6, 9, 10, 14, 15, 56] 
start = np.searchsorted(a, 6, 'left') 
end = np.searchsorted(a, 10, 'right') 
rng = np.arange(start, end) 
rng 
# array([3, 4, 5]) 
33

के रूप में @ डीनोनीचुसौर के जवाब में, लेकिन यहां तक ​​कि अधिक कॉम्पैक्ट:

In [7]: np.where((a >= 6) & (a <=10)) 
Out[7]: (array([3, 4, 5]),) 
+10

अच्छा। आप 'a [(a> = 6) और (a <= 10)] '' '' एक' एक 'numpy सरणी भी कर सकते हैं। –

1
s=[52, 33, 70, 39, 57, 59, 7, 2, 46, 69, 11, 74, 58, 60, 63, 43, 75, 92, 65, 19, 1, 79, 22, 38, 26, 3, 66, 88, 9, 15, 28, 44, 67, 87, 21, 49, 85, 32, 89, 77, 47, 93, 35, 12, 73, 76, 50, 45, 5, 29, 97, 94, 95, 56, 48, 71, 54, 55, 51, 23, 84, 80, 62, 30, 13, 34] 

dic={} 

for i in range(0,len(s),10): 
    dic[i,i+10]=list(filter(lambda x:((x>=i)&(x<i+10)),s)) 
print(dic) 

for keys,values in dic.items(): 
    print(keys) 
    print(values) 

आउटपुट:

(0, 10) 
[7, 2, 1, 3, 9, 5] 
(20, 30) 
[22, 26, 28, 21, 29, 23] 
(30, 40) 
[33, 39, 38, 32, 35, 30, 34] 
(10, 20) 
[11, 19, 15, 12, 13] 
(40, 50) 
[46, 43, 44, 49, 47, 45, 48] 
(60, 70) 
[69, 60, 63, 65, 66, 67, 62] 
(50, 60) 
[52, 57, 59, 58, 50, 56, 54, 55, 51] 
-1

आप एक ही प्राप्त करने के लिए np.clip() उपयोग कर सकते हैं:

a = [1, 3, 5, 6, 9, 10, 14, 15, 56] 
np.clip(a,6,10) 

हालांकि, यह मान कम से कम रखता है और अधिक से अधिक 6 और 10 क्रमशः।

0
a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56]) 
np.argwhere((a>=6) & (a<=10)) 
-1

यह कोड स्निपेट दो मानों के बीच एक numpy सरणी में सभी नंबरों को प्रस्तुत करती है:

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56]) 
a[(a>6)*(a<10)] 

यह निम्नलिखित के रूप में काम करता है: (एक> 6) देता है यह सच है (1) और के साथ एक numpy सरणी झूठा (0), तो करता है (एक < 10)। इन दोनों को एक साथ गुणा करके आप एक सच्चाई के साथ एक सरणी प्राप्त करते हैं, यदि दोनों कथन सत्य हैं (क्योंकि 1x1 = 1) या गलत (क्योंकि 0x0 = 0 और 1x0 = 0)।

भाग एक [...] सरणी के सभी मान देता है जहां ब्रैकेट के बीच सरणी एक सही कथन देता है।

बेशक आप उदाहरण

...*(1-a<10) 

जो एक "और नहीं" बयान के समान है के लिए कह रही द्वारा इस और अधिक जटिल बना सकते हैं।

+1

कोड स्निपेट के लिए कुछ स्पष्टीकरण अच्छा होगा। –

+0

ए एक numpy array फ़ंक्शन (ए> 6) सत्य (1) या गलत (0) गुणा करता है (एक <10) जो सत्य (1) या गलत (1) लौटाता है, केवल तभी होता है जब दोनों सत्य होते हैं यह एक 1 लौटाता है और सरणी मुद्रित है। यदि आप "लेकिन नहीं" करना चाहते हैं, तो आप इसके लिए योग कर सकते हैं, लेकिन आप (1 <10) इत्यादि के बजाय (1 - एक <10) जोड़ सकते हैं। मैं सफेद रेखाएं कैसे जोड़ूं? – Nathan

+0

अब इसे एक टिप्पणी के रूप में छोड़ने के बजाय उत्तर में जोड़ें और आप जाने के लिए अच्छे हैं। :) –

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