2015-06-14 12 views
18

Szukałem sposobu, aby skutecznie sprawdzić duplikaty w tablicy numpy i natknąłem się na pytanie, które zawiera odpowiedź za pomocą tego kodu.Co to oznacza: s [s [1:] == s [: - 1]] robi w numpy?

Co oznacza ta linia w numpy?

s[s[1:] == s[:-1]] 

Chciałbyś zrozumieć kod przed jego zastosowaniem. Wyglądał w dokumencie Numpy, ale miał problemy ze znalezieniem tych informacji.

Odpowiedz

20

Plastry [1:] i [:-1] oznacza wszystkie, oprócz pierwszego i wszystkie oprócz ostatniego elementów tablicy:

>>> import numpy as np 
>>> s = np.array((1, 2, 2, 3)) # four element array 
>>> s[1:] 
array([2, 2, 3]) # last three elements 
>>> s[:-1] 
array([1, 2, 2]) # first three elements 

dlatego porównania wytwarza się szereg logicznych porównań między każdym elementem s[x] i jego "sąsiad"s[x+1], który będzie o jeden krótszy niż oryginalna tablica (ponieważ ostatni element nie ma sąsiada):

>>> s[1:] == s[:-1] 
array([False, True, False], dtype=bool) 

i stosując tę ​​tablicę do indeksu oryginalna tablica dostaje elementy gdzie porównanie jest True, czyli elementów, które są takie same jak ich sąsiad:

>>> s[s[1:] == s[:-1]] 
array([2]) 

Zauważ, że to tylko identyfikuje sąsiedztwie zduplikowane wartości.

+0

Wow, dzięki za dokładne wyjaśnienie: D. Przyjmie jak najszybciej. Więc domyślam się znaleźć wszystkich dupków, posortuj, a następnie wykonaj to: D. – zehelvion

+0

@zehelvion tak, jeśli tablica jest nieposortowana, będziesz musiał najpierw sortować tę metodę, aby znaleźć wszystkie duplikaty. – jonrsharpe

+0

Czy tablica nie musi być sortowana jako wymagająca? – gabhijit

3

s[1:] == s[:-1] porównuje s bez pierwszego elementu z s bez ostatniego elementu, tj 0TH z 1, 1 z 2-ty itp, dając tablicę len(s) - 1 logicznych elementów. s[boolarray] wybierze tylko te elementy z s, które mają True w odpowiednim miejscu w boolarray. W ten sposób kod wyodrębnia wszystkie elementy, które są równe następnemu elementowi.

6

to sprawdzić:

>>> s=numpy.array([1,3,5,6,7,7,8,9]) 
>>> s[1:] == s[:-1] 
array([False, False, False, False, True, False, False], dtype=bool) 
>>> s[s[1:] == s[:-1]] 
array([7]) 

Więc s[1:] daje wszystkie numery ale pierwszy i s[:-1] wszystkie oprócz ostatniego. Teraz porównaj te dwa wektory, np. sprawdź, czy dwa sąsiednie elementy są takie same. Na koniec wybierz te elementy.

3

Pokaże duplikaty w posortowanej tablicy.

Zasadniczo wewnętrzne wyrażenie s[1:] == s[:-1] porównuje tablicę z jej przesuniętą wersją. Wyobraź sobie:

1, [2, 3, ... n-1, n ] 
- [1, 2, ... n-2, n-1] n 
=> [F, F, ... F, F ] 

W posortowanej tablicy, nie będzie skutkowało True w tablicy chyba miałeś powtórzeń. Następnie to wyrażenie s[array] filtruje te, które mają True w indeksie .

Powiązane problemy