जबकि इटरेटर आधारित जवाब, बिल्कुल ठीक हैं अगर आप NumPy सरणी के साथ काम कर रहे हैं (जैसा कि आप का उल्लेख है कि आप कर रहे हैं) वहाँ का चयन चीजों में से बेहतर और तेज रास्ते हैं:
import numpy as np
data = np.array([
[100002, 2006, 1.1, 0.01, 6352],
[100002, 2006, 1.2, 0.84, 304518],
[100002, 2006, 2, 1.52, 148219],
[100002, 2007, 1.1, 0.01, 6292],
[10002, 2006, 1.1, 0.01, 5968],
[10002, 2006, 1.2, 0.25, 104318],
[10002, 2007, 1.1, 0.01, 6800],
[10002, 2007, 4, 2.03, 25446],
[10002, 2008, 1.1, 0.01, 6408] ])
subset1 = data[data[:,0] == 100002]
subset2 = data[data[:,0] == 10002]
यह पैदावार
subset1:
array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03],
[ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05],
[ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05],
[ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]])
subset2:
array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03],
[ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05],
[ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03],
[ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04],
[ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]])
यदि आप पहले कॉलम में अद्वितीय मानों को पहले से नहीं जानते थे, तो आप उन्हें खोजने के लिए numpy.unique1d
या बिल्टिन फ़ंक्शन set
का उपयोग कर सकते हैं।
संपादित करें: मैं सिर्फ महसूस किया कि आप कुछ इस तरह कर सकते हैं जहां दो कॉलम की अद्वितीय संयोजन है ... उस मामले में डेटा का चयन करना चाहता था:
col1 = data[:,0]
col2 = data[:,1]
subsets = {}
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)):
subset = data[(col1 == val1) & (col2 == val2)]
if np.any(subset):
subsets[(val1, val2)] = subset
(मैं भंडारण कर रहा हूँ कुंजी के रूप में सबसेट, कुंजी संयोजन के एक tuple के साथ ... निश्चित रूप से अन्य (और बेहतर है, आप क्या कर रहे हैं के आधार पर) यह करने के तरीके!)
याद रखने के लिए आदेशों की मेरी सूची में फ़िल्टर जोड़ूंगा! पूर्व-निरीक्षण में यह इतना स्पष्ट है कि मुझे इसे स्वयं करना चाहिए था, लेकिन आपकी व्याख्या पूरी हो गई है। हालांकि, क्या आप जानते हैं कि इटरेटर की तुलना में इस दृष्टिकोण का उपयोग करके हम कितनी गति प्राप्त कर सकते हैं?मैंने सोचा कि इटेटर भी बहुत तेज़ हैं! – user308827
@ user308827 - वे हैं, लेकिन यदि आप numpy arrays के साथ काम कर रहे हैं, और सूचियों के साथ काम नहीं कर रहे हैं, तो चीजें करने के numpy तरीके का उपयोग कर तेजी से होगा। आम तौर पर, एक संपूर्ण numpy सरणी के माध्यम से पुनरावृत्ति धीमा है। इटरेटर-आधारित समाधानों को अजगर में प्रत्येक तत्व के माध्यम से फिर से शुरू करना होता है। जब आप एक बूलियन numpy सरणी का उपयोग कर एक numpy सरणी का एक सबसेट का चयन करते हैं, तो संकलन कोड में दृश्यों के पीछे पुनरावृत्ति किया जाता है। (मैं यहां oversimplifying हूँ, लेकिन यह भी है, वैसे भी)। असल में, यदि आप अपने डेटा को रखने के लिए numpy arrays का उपयोग कर रहे हैं, तो यह numpy कार्यों के साथ उन पर काम करने के लिए तेज़ है। –
इसके अलावा, सबसेट में 2 स्थितियों को गठबंधन करने का कोई तरीका है? उदा।, Subset1 = डेटा [(डेटा [:, 0] == 100002) और (डेटा [:, 1] == 2007)] काम नहीं कर रहा है। धन्यवाद! – user308827