2015-08-06 15 views
8

mam jedną wielką tablicę:Python: Split NumPy tablica na podstawie wartości w tablicy

[(1.0, 3.0, 1, 427338.4297000002, 4848489.4332) 
(1.0, 3.0, 2, 427344.7937000003, 4848482.0692) 
(1.0, 3.0, 3, 427346.4297000002, 4848472.7469) ..., 
(1.0, 1.0, 7084, 427345.2709999997, 4848796.592) 
(1.0, 1.0, 7085, 427352.9277999997, 4848790.9351) 
(1.0, 1.0, 7086, 427359.16060000006, 4848787.4332)] 

Chcę podzielić tę tablicę na wiele tablic oparty na 2 wartości w tablicy (3,0, 3,0, 3,0 ... 1,0, 1,0,10).

Za każdym razem, gdy zmienia się druga wartość, chcę nowej tablicy, więc zasadniczo każda nowa tablica ma tę samą drugą wartość. Szukałem tego w górę na przepełnienie stosu i wiem polecenia

np.split(array, number) 

ale ja nie staram się podzielić tablicę do pewnej liczby tablic, ale raczej przez wartość. Jak mógłbym podzielić tablicę w sposób określony powyżej? Każda pomoc będzie doceniona!

+0

jest także 'groupby' pandy to: http://stackoverflow.com/questions/33622888/how-to-plot-2-lines-based-on- wartość-nie-kolumny –

Odpowiedz

11

można znaleźć indeksów w których wartości różnią się za pomocą numpy.where i numpy.diff na pierwszej kolumnie:

>>> arr = np.array([(1.0, 3.0, 1, 427338.4297000002, 4848489.4332), 
(1.0, 3.0, 2, 427344.7937000003, 4848482.0692), 
(1.0, 3.0, 3, 427346.4297000002, 4848472.7469), 
(1.0, 1.0, 7084, 427345.2709999997, 4848796.592), 
(1.0, 1.0, 7085, 427352.9277999997, 4848790.9351), 
(1.0, 1.0, 7086, 427359.16060000006, 4848787.4332)]) 
>>> np.split(arr, np.where(np.diff(arr[:,1]))[0]+1) 
[array([[ 1.00000000e+00, 3.00000000e+00, 1.00000000e+00, 
      4.27338430e+05, 4.84848943e+06], 
     [ 1.00000000e+00, 3.00000000e+00, 2.00000000e+00, 
      4.27344794e+05, 4.84848207e+06], 
     [ 1.00000000e+00, 3.00000000e+00, 3.00000000e+00, 
      4.27346430e+05, 4.84847275e+06]]), 
array([[ 1.00000000e+00, 1.00000000e+00, 7.08400000e+03, 
      4.27345271e+05, 4.84879659e+06], 
     [ 1.00000000e+00, 1.00000000e+00, 7.08500000e+03, 
      4.27352928e+05, 4.84879094e+06], 
     [ 1.00000000e+00, 1.00000000e+00, 7.08600000e+03, 
      4.27359161e+05, 4.84878743e+06]])] 

Objaśnienie:

Oto pierwszy mamy zamiar się pobrać pozycje w sekundę 2 kolumna:

>>> arr[:,1] 
array([ 3., 3., 3., 1., 1., 1.]) 

Teraz, aby dowiedzieć się, gdzie elementy faktycznie się zmieniają, Można użyć numpy.diff:

>>> np.diff(arr[:,1]) 
array([ 0., 0., -2., 0., 0.]) 

niczego niezerową oznacza, że ​​pozycja obok było inaczej, możemy użyć numpy.where znaleźć wskaźników niezerowych elementów, a następnie dodać 1 do niego, ponieważ rzeczywisty wskaźnik taki element jest o jeden więcej niż zwróconego index:

>>> np.where(np.diff(arr[:,1]))[0]+1 
array([3]) 
+0

Otrzymuję IndexError: Zbyt wiele indeksów dla tablicy. Czy wiesz, co to jest problem? Dzięki za pomoc! – whent1991

+0

@ whent1991 Czy umieścisz aktualną tablicę? –

+0

Ten, który napisałem, jest rzeczywistą tablicą, ale jest to ogromna tablica, więc w środku tablicy znajduje się "...". – whent1991

Powiązane problemy