Załóżmy, że mam następującą listę w Pythonie:
a = [1,2,3,1,2,1,1,1,3,2,2,1]
Jak w zgrabny sposób znaleźć najczęstszy numer na tej liście?
python
numpy
statistics
JustInTime
źródło
źródło
np.bincount([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1]).argmax()
scipy.stats.mode
, chociaż mniej ogólne.Counter(array).most_common(1)[0][0]
Możesz użyć
Jeśli jakiś element występuje tak samo często jak inny, ten kod zwróci tylko pierwszy element.
źródło
values[counts.argmax()]
zwróci pierwszą wartość. Aby uzyskać je wszystkie, możemy użyćvalues[counts == counts.max()]
.Jeśli chcesz używać SciPy :
źródło
Wydajność (przy użyciu iPythona) dla niektórych rozwiązań znalezionych tutaj:
Najlepsze jest „max” z „set” dla małych tablic, takich jak problem.
Według @Davida Sandersa, jeśli zwiększysz rozmiar tablicy do około 100 000 elementów, algorytm „max w / set ” okazuje się zdecydowanie najgorszy, podczas gdy metoda „numpy bincount” jest najlepsza.
źródło
a = (np.random.rand(100000) * 1000).round().astype('int'); a_list = list(a)
), twój algorytm „max w / set” okaże się zdecydowanie najgorszy, podczas gdy metoda „numpy bincount” jest najlepsza. Przeprowadziłem ten test, używająca_list
natywnego kodu Pythona ia
kodu numpy, aby uniknąć kosztów krosowania, które zepsułyby wyniki.Jeśli chcesz uzyskać najczęstszą wartość (dodatnią lub ujemną) bez ładowania jakichkolwiek modułów, możesz użyć następującego kodu:
źródło
max(set(lVals), key=lVals.count)
, które oblicza O (n) dla każdego unikalnego elementu olVals
około O (n ^ 2) (zakładając O (n) unikalne elementy). Korzystaniecollections.Counter(lVals).most_common(1)[0][0]
z biblioteki standardowej, zgodnie z sugestią JoshAdela , to tylko O (n).Chociaż większość powyższych odpowiedzi jest przydatna, w przypadku, gdy: 1) potrzebujesz jej do obsługi liczb całkowitych innych niż dodatnie (np. Zmiennoprzecinkowe lub ujemne liczby całkowite ;-)) i 2) nie są w Pythonie 2.7 (które kolekcje. wymaga) i 3) wolę nie dodawać zależności scipy (lub nawet numpy) do swojego kodu, to rozwiązanie czysto Python 2.6, które jest O (nlogn) (tj. wydajne), jest takie:
źródło
Podoba mi się rozwiązanie JoshAdela.
Ale jest tylko jeden haczyk.
np.bincount()
Rozwiązanie działa tylko na liczbach.Jeśli masz sznurki,
collections.Counter
rozwiązanie będzie działać dla Ciebie.źródło
Rozwinięcie tej metody , zastosowane do znalezienia trybu danych, w którym może być potrzebny indeks rzeczywistej tablicy, aby zobaczyć, jak daleko wartość znajduje się od środka rozkładu.
Pamiętaj, aby odrzucić tryb, gdy len (np.argmax (counts))> 1
źródło
W Pythonie 3 powinno działać:
źródło
Począwszy od programu
Python 3.4
, biblioteka standardowa zawierastatistics.mode
funkcję zwracającą pojedynczy najczęściej używany punkt danych.Jeśli istnieje wiele trybów o tej samej częstotliwości,
statistics.mode
zwraca pierwszy napotkany.Począwszy od
Python 3.8
,statistics.multimode
funkcja zwraca listę najczęściej występujących wartości w kolejności, w jakiej zostały napotkane po raz pierwszy:źródło
Oto ogólne rozwiązanie, które można zastosować wzdłuż osi, niezależnie od wartości, używając czysto numpy. Odkryłem również, że jest to znacznie szybsze niż tryb scipy.stats.mode, jeśli istnieje wiele unikalnych wartości.
źródło
Ostatnio robię projekt i używam kolekcji Counter (co mnie torturowało).
Liczniki w kolekcjach mają moim zdaniem bardzo, bardzo złe działanie. To tylko dykt zawijania klas ().
Co gorsza, jeśli użyjesz cProfile do profilowania swojej metody, powinieneś zobaczyć wiele rzeczy „__missing__” i „__instancecheck__” marnujących się przez cały czas.
Uważaj, używając jej most_common (), ponieważ za każdym razem wywoływałaby sortowanie, które czyniło ją wyjątkowo powolną. a jeśli użyjesz most_common (x), wywoła sortowanie sterty, które również jest powolne.
Btw, numpy's bincount również ma problem: jeśli używasz np.bincount ([1,2,4000000]), otrzymasz tablicę z 4000000 elementami.
źródło