2013-10-01 3 views
5

मैं उन पंक्तियों को कैसे ला सकता हूं जिनके लिए दूसरा कॉलम 4 या 6 के बराबर है?numpy: मापदंडों के समूह के आधार पर पंक्तियों का चयन कैसे करें

a = np.array(np.mat('1 2; 3 4; 5 6; 7 4')) 
b = [4,6] 

जाहिर है, यह काम नहीं करता है:

c = a[a[:,1] in b] 

उत्तर

1

आप itertools.ifilter उपयोग कर सकते हैं:

from itertools import ifilter 
c = np.array([ e for e in ifilter(lambda x: x[1] in b, a) ]) 
>> array([[3,4], 
      [5,6], 
      [7,4]]) 
+6

यह बड़े सरणी के लिए बहुत धीमा है। NumPy arrays के साथ काम करते समय, वेक्टरकृत मुहावरों को प्राथमिकता दी जानी चाहिए। –

+1

क्या आपको बता रहा है कि ओपी बड़े सरणी का उपयोग कर रहा है? मैं बिग डेटा पर काम किए बिना बड़े पैमाने पर नम्पी का उपयोग करता हूं। – lucasg

2

[x एक्स के लिए एक अगर में एक्स [1] (4,6 में,)] आपके द्वारा उल्लेखित मामले के लिए ऐसा करना चाहिए।

संपादित करें: जैसा कि @georgesl सुझाव देता है, "आदर्श तरीका" स्ट्रिंग पर numpy.mat विधि का उपयोग करने के बजाय सरणी का निर्माण करते समय एक इटरेटर का उपयोग करना है।

+0

georgesl के उत्तर के समान आपत्ति: यह अनावश्यक रूप से धीमा है क्योंकि यह NumPy के वेक्टरीकृत परिचालनों का उपयोग नहीं करता है। –

+0

लार्समैन इस तरह के संचालन के लिए अनुकूलित नहीं होने पर एक वैध चिंता है, यह अभी भी मान्य है क्योंकि @ georgesl की टिप्पणी जाती है। ओपी ने बड़े सरणी का उपयोग करने के बारे में स्पष्ट रूप से कोई संकेत नहीं दिया है। – techiev2

2

आप कर सकते हैं:

check = np.logical_or(a[:,1]==4, a[:,1]==6) 
c = a[check,:] 

तुम भी तार्किक ऑपरेटर or के लिए | उपयोग कर सकते हैं:

check = (a[:,1]==4) | (a[:,1]==6) 
10

यह कर होगा की numpythonic रास्ता in1d उपयोग करने के लिए, कुछ की तरह:

a[np.in1d(a[:, 1], b)] 
संबंधित मुद्दे