2015-11-21 23 views
6

yılında aralıklarla dizin, dizi birden fazla öğe için: 300, 401 500 için elemanlarınaListeleri nasıl olduğunu varsayalım Python

import numpy as np 
a = [2, 4, 6, 8, ..., 1000] # total 500 elements 
b = np.array(a)    # numpy version 
Ben 100 için 1 almak istiyorum

, 201. ve bunları yapmak yeni bir dizi. Bu amaçla

, ben aşağıdaki kodları denedim:

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

Ama basit bir şekilde tek-çizgi-endeksleme

Say ile yapmak istiyorum:

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]] 

Ama Yukarıdaki tüm geçersiz ve böyle bir oneliner endeksleme bulamadık.

+1

(+ değerleri eleman akıllıca ekler). Veya ister misiniz? A_sub = b [aralık (0,100) + aralık (200,300) + aralık (400,500)] ' –

+0

Yani özellikle bir satırdaki bir listeyi dizine ekleyemezsiniz, özellikle a_sub = a [(0: 100, 200: 300, 400: 500)] –

+0

Burada yayınlanan çözümlerden herhangi biri sizin için çalışıyor mu? – Divakar

cevap

1

Dilimleri bir maske dizisine (bir dizisi parçalayarak) dönüştürebilir ve maske dizilerini | (veya) operatörünü kullanarak birleştirebilirsiniz. senin dilimleri çakışırsa, ya da olmayan bir artan sıralamada göründüğünü

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

Not bu orijinal kodu (öğeler tekrarlamak istemiyorum farklı bir dizi neden olur ve hep aynı sırada görünür orijinal dizi).

3

Çok gibi np.reshape ve slicing ile yeniden şekillendirilmesi kullanın olabilir -

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

a, bunu böyle bir NumPy dizisi yapabileceğini edilir -

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

iyi, saf piton olduğunu ama belki de bu sorunun cevabını

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

iki tane diğerini de çözebilir. astar:

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

Ayrıca kullanabilirsiniz 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

veya kullanarak hstack bu mümkün olup olmadığını bilmiyorum

a = np.arange(1000) 
limits = [(0, 100), (200, 300), (400, 500)] 
b = np.hstack(a[low:high] for low, high in limits) 
İlgili konular