2015-11-21 7 views
6

में अंतराल के साथ सूचकांक सरणी के एक से अधिक आइटम के लिए:कैसे मान लीजिए कि मैं एक सूची है अजगर

import numpy as np 
a = [2, 4, 6, 8, ..., 1000] # total 500 elements 
b = np.array(a)    # numpy version 

मैं 100 वीं करने के लिए 1 प्राप्त करना चाहते हैं, 300 वीं, 500 वीं करने के लिए 401 तत्वों के लिए 201 वीं और उन्हें बनाना एक नई सरणी

इस उद्देश्य से, मैं निम्नलिखित कोड की कोशिश की है:

a_sub = a[0:100] + a[200:300] + a[400:500] 
b_sub = np.concatenate((b[0:100], b[200:300], b[400:500])) 

लेकिन मैं एक साधारण oneline अनुक्रमण

कहते हैं के साथ क्या करना चाहते हैं:

a_sub = a[(0:100, 200:300, 400:500)] 
a_sub = a[[0:100, 200:300, 400:500]] 
b_sub = b[[0:100, 200:300, 400:500]] 
b_sub = b[[0:100, 200:300, 400:500]] 

लेकिन उपरोक्त सभी अमान्य हैं और मुझे ऐसे ऑनलाइनर इंडेक्सिंग नहीं मिल सका।

+1

अगर यह संभव हो सकता है मैं नहीं जानता कि (+ मूल्यों तत्व बुद्धिमान कहते हैं)। या आप यह चाहते हैं कि यह 'a_sub = b [रेंज (0,100) + रेंज (200,300) + रेंज (400,500)] ' –

+0

मेरा मतलब है कि आप उस पंक्ति की सूची को विशेष रूप से' a_sub = a [(0: 100, 200: 300, 400: 500)] ' –

+0

क्या यहां पोस्ट किए गए कोई भी समाधान आपके लिए काम करता है? – Divakar

उत्तर

1

आप स्लाइस को मास्क-सरणी (एक-सरणी को टुकड़ा करके) में परिवर्तित कर सकते हैं, और | (या) ऑपरेटर का उपयोग करके मुखौटा-सरणी को संघबद्ध कर सकते हैं।

ones = np.ones(b.shape, dtype = bool) 
mask = ones[ 0:100] | ones[200:300] | ones[400:500] 
b_sub = b[mask] 

ध्यान दें कि यदि आपका स्लाइस ओवरलैप, या एक गैर बढ़ते क्रम में दिखाई देते हैं, यह आपकी मूल कोड (आइटम दोहराना नहीं होगा तुलना में एक अलग सरणी के साथ परिणाम, और हमेशा के समान ही क्रम में दिखाई देगा मूल सरणी)।

3

आप np.reshape और slicing साथ देगी सकता है का उपयोग करें, तो जैसे -

np.array(a).reshape(-1,100)[::2].ravel() 

तो a एक NumPy सरणी, तुम इतनी तरह से कर सकता है - अच्छी तरह से

a.reshape(-1,100)[::2].ravel() 
1

, यह शुद्ध अजगर है, लेकिन हो सकता है कि यह आपके प्रश्न को हल कर सके

a = [2, 4, 6, 8, ..., 1000] 
slices = ((0, 100), (200, 300), (400, 500)) 

def new_from_slices(list_, slices): 
    return list(itertools.chain(*[list_[s[0]:s[1]] for s in slices])) 
new_from_slices(a, slices) 
0

दो अन्य एक- लाइनर:

[x for i,x in enumerate(a) if i//100%2==0] #python 
b[np.arange(len(b))//100%2==0] # numpy 
1

तुम भी इस्तेमाल कर सकते हैं np.split:

a = range(2, 1002, 2) 
edges = [100, 200, 300, 400] 
subarrays = np.split(a, edges) 
b = np.hstack(subarrays[i] for i in [0, 2, 4]) 
0

या का उपयोग कर hstack

a = np.arange(1000) 
limits = [(0, 100), (200, 300), (400, 500)] 
b = np.hstack(a[low:high] for low, high in limits) 
संबंधित मुद्दे