2016-07-09 22 views
7

Załóżmy, że mam tej tablicy numpy:Dzielenie tablica Numpy na podstawie wartości

a = np.array([0, 3, 5, 5, 0, 10, 14, 15, 56, 0, 12, 23, 45, 23, 12, 45, 
       0, 1, 0, 2, 3, 4, 0, 0 ,0]) 

Chciałbym, aby wydrukować wszystkie numery między 0s i automatycznie dodawać je do nowego np.array (patrz poniżej):

a1=[3, 5, 5] 
a2=[10, 14, 15, 56] 
a3=[12, 23, 45, 23, 12, 45] 
a4=[1] 
a5=[2, 3, 4] 

Czy jest do tego wbudowana funkcja?

+0

To nie jest rodzaj. – user2357112

+0

Tytuł został zmodyfikowany, dziękuję za wskazanie –

Odpowiedz

3

można uzyskać indeksy zer z np.where:

zeros = np.where(a == 0)[0] 

I iteracyjne nad każdą parę do plasterków tablicy:

[a[i+1:j] for i, j in zip(zeros, zeros[1:]) if len(a[i+1:j])>0] 

Out[46]: 
[array([3, 5]), 
array([10, 14, 15, 56]), 
array([12, 23, 45, 23, 12, 45]), 
array([1]), 
array([2, 3, 4])] 
+0

To rozwiązanie nie działa, jeśli tablica zaczyna się od niezerowej liczby całkowitej, np. 'a = np.array ([1, 0, 3, 5, 0, 0, 10, 0])' – Alexander

+0

@Alexander Wypisuje '[3, 5]' i '[10]'. Czy to nie prawda? – ayhan

+0

Z próbką, którą podałem powyżej, powinno to być [[1], [3, 5], [10]] – Alexander

6

Można użyć groupby() funkcję od itertools i określić key jako warunek binarny równy zero lub niezerowy. W ten sposób wszystkie kolejne zera i nonzeros zostaną zgrupowane razem. Użyj filtru if, aby wybrać grupy nonzeros i użyj list do konwersji niezerowych grupujących na listy.

from itertools import groupby 
[list(g) for k, g in groupby(a, lambda x: x != 0) if k] 

# [[3, 5], [10, 14, 15, 56], [12, 23, 45, 23, 12, 45], [1], [2, 3, 4]] 
0

Nie potrzeba numpy, funkcja lambda pracuje na liście, ale możemy zamienić numpy tablicę do iz listy na drodze i na zewnątrz:

cut = lambda x: [j for j in [cut(x[:x.index(0)])]+cut(x[x.index(0)+1:]) if j] if x.count(0) else x 

numpy.array(cut(list(a))) 

# array([[3, 5, 5], [10, 14, 15, 56], [12, 23, 45, 23, 12, 45], [1], [2, 3, 4]], dtype=object) 
2

NumPy na split() i where() na liście compehension:

[x[x!=0] for x in np.split(a, np.where(a==0)[0]) if len(x[x!=0])] 

[array([3, 5, 5]), 
array([10, 14, 15, 56]), 
array([12, 23, 45, 23, 12, 45]), 
array([1]), 
array([2, 3, 4])] 
2

Oto wektorowy podejście używając np.where i np.split -

idx = np.where(a!=0)[0] 
aout = np.split(a[idx],np.where(np.diff(idx)!=1)[0]+1) 

run Sample -

In [23]: a 
Out[23]: 
array([ 0, 3, 5, 5, 0, 10, 14, 15, 56, 0, 0, 0, 12, 23, 45, 23, 12, 
     45, 0, 1, 0, 2, 3, 4, 0, 0, 0]) 

In [24]: idx = np.where(a!=0)[0] 

In [25]: np.split(a[idx],np.where(np.diff(idx)!=1)[0]+1) 
Out[25]: 
[array([3, 5, 5]), 
array([10, 14, 15, 56]), 
array([12, 23, 45, 23, 12, 45]), 
array([1]), 
array([2, 3, 4])] 
Powiązane problemy