मेरे पास सूची में निम्नलिखित कॉलम नाम हैं:

 vars = ['age','balance','day','duration','campaign','pdays','previous','job_admin.','job_blue-collar']

मेरे पास एक सरणी है जिसमें सरणी अनुक्रमणिका शामिल हैं

(array([1, 5, 7], dtype=int64),)

मैं सरणी अनुक्रमणिका के आधार पर सूची को सबसेट करना चाहता हूं

वांछित आउटपुट होना चाहिए

vars = ['balance','pdays','job_admin.']

मैंने अजगर में कुछ इस तरह की कोशिश की है

for i, a in enumerate(X):
   if i in new_L:
       print i

लेकिन यह काम नहीं करता है।

5
Neil 3 अप्रैल 2018, 11:21

4 जवाब

सबसे बढ़िया उत्तर

यदि आप वैसे भी numpy का उपयोग कर रहे हैं, तो इसकी उन्नत अनुक्रमणिका का उपयोग करें

import numpy as np
vars = ['age','balance','day','duration','campaign','pdays',
        'previous','job_admin.','job_blue-collar']
indices = (np.array([1, 5, 7]),)

sub_array = np.asarray(vars)[indices]  
# --> array(['balance', 'pdays', 'job_admin.'], dtype='<U15')

या यदि आप list चाहते हैं

sub_list = np.asarray(vars)[indices].tolist()
# --> ['balance', 'pdays', 'job_admin.']
4
FHTMitchell 3 अप्रैल 2018, 08:33

आप operator.itemgetter का उपयोग कर सकते हैं:

>>> import numpy as np
>>> import operator
>>> vars = ['age','balance','day','duration','campaign','pdays','previous','job_admin.','job_blue-collar']
>>> idx = np.array([1,5,7])
>>> operator.itemgetter(*idx)(vars)
('balance', 'pdays', 'job_admin.'

यह वास्तव में अब तक पोस्ट किया गया सबसे तेज़ समाधान है।

>>> from timeit import repeat
>>> kwds = dict(globals=globals(), number=1000000)
>>> 
>>> repeat("np.asarray(vars)[idx]", **kwds)
[2.2382465780247003, 2.225632123881951, 2.1969433058984578]
>>> repeat("[vars[i] for i in idx]", **kwds)
[0.9384958958253264, 0.9366465201601386, 0.9373494561295956]
>>> repeat("operator.itemgetter(*idx)(vars)", **kwds)
[0.9045725339092314, 0.9015877249184996, 0.9032398068811744]

दिलचस्प बात यह है कि यदि हम पहले idx को किसी सूची में परिवर्तित करते हैं, और इसमें रूपांतरण की लागत भी शामिल है, तो यह दोगुने से भी अधिक तेज़ हो जाती है:

>>> repeat("operator.itemgetter(*idx.tolist())(vars)", **kwds)
[0.4062491739168763, 0.4086623480543494, 0.4049343201331794]

हम परिणाम को सूची में बदलने का जोखिम भी उठा सकते हैं और अभी भी अन्य सभी समाधानों की तुलना में बहुत तेज हैं:

>>> repeat("list(operator.itemgetter(*idx.tolist())(vars))", **kwds)
[0.561687784967944, 0.5593925788998604, 0.5586365279741585]
1
Paul Panzer 3 अप्रैल 2018, 08:55
index = [1, 5, 7]
vars = [vars[i] for i in index]
2
Jordi 3 अप्रैल 2018, 08:27

ऐसा करने के लिए बस एक लूप का उपयोग करें:

result=[]
for i in your_array:
   result.append(vars[i])

या एक रैखिक

 [vars[i] for i in your_array]
17
pylover 8 अप्रैल 2018, 10:11