मैं उन पंक्तियों को कैसे ला सकता हूं जिनके लिए दूसरा कॉलम 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]
मैं उन पंक्तियों को कैसे ला सकता हूं जिनके लिए दूसरा कॉलम 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]
आप 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]])
[x एक्स के लिए एक अगर में एक्स [1] (4,6 में,)] आपके द्वारा उल्लेखित मामले के लिए ऐसा करना चाहिए।
संपादित करें: जैसा कि @georgesl सुझाव देता है, "आदर्श तरीका" स्ट्रिंग पर numpy.mat विधि का उपयोग करने के बजाय सरणी का निर्माण करते समय एक इटरेटर का उपयोग करना है।
georgesl के उत्तर के समान आपत्ति: यह अनावश्यक रूप से धीमा है क्योंकि यह NumPy के वेक्टरीकृत परिचालनों का उपयोग नहीं करता है। –
लार्समैन इस तरह के संचालन के लिए अनुकूलित नहीं होने पर एक वैध चिंता है, यह अभी भी मान्य है क्योंकि @ georgesl की टिप्पणी जाती है। ओपी ने बड़े सरणी का उपयोग करने के बारे में स्पष्ट रूप से कोई संकेत नहीं दिया है। – techiev2
आप कर सकते हैं:
check = np.logical_or(a[:,1]==4, a[:,1]==6)
c = a[check,:]
तुम भी तार्किक ऑपरेटर or
के लिए |
उपयोग कर सकते हैं:
check = (a[:,1]==4) | (a[:,1]==6)
यह कर होगा की numpythonic रास्ता in1d
उपयोग करने के लिए, कुछ की तरह:
a[np.in1d(a[:, 1], b)]
यह बड़े सरणी के लिए बहुत धीमा है। NumPy arrays के साथ काम करते समय, वेक्टरकृत मुहावरों को प्राथमिकता दी जानी चाहिए। –
क्या आपको बता रहा है कि ओपी बड़े सरणी का उपयोग कर रहा है? मैं बिग डेटा पर काम किए बिना बड़े पैमाने पर नम्पी का उपयोग करता हूं। – lucasg