W numpy
/ scipy
, czy istnieje skuteczny sposób na uzyskanie liczby częstotliwości dla unikalnych wartości w tablicy?
Coś w tym stylu:
x = array( [1,1,1,2,2,2,5,25,1,1] )
y = freq_count( x )
print y
>> [[1, 5], [2,3], [5,1], [25,1]]
(Dla ciebie, użytkowników R tam, po prostu szukam table()
funkcji)
collections.Counter(x)
wystarczający?Odpowiedzi:
Spójrz na
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
I wtedy:
lub:
lub jednak chcesz połączyć liczby i unikalne wartości.
źródło
Począwszy od Numpy 1.9, najłatwiejszą i najszybszą metodą jest po prostu użycie
numpy.unique
, która ma terazreturn_counts
argument słowa kluczowego:Co daje:
Szybkie porównanie z
scipy.stats.itemfreq
:źródło
return_counts
argument słowa kluczowego nie istniał, co może wyjaśniać wyjątek. W takim przypadku dokumenty sugerują, żenp.unique(x, True)
jest to równoważnenp.unique(x, return_index=True)
, co nie zwraca liczby.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Po dodaniu tej funkcji (patrz tutaj ) niektóre nieformalne testy wykorzystywałyreturn_counts
taktowanie ponad 5 razy szybciej.Aktualizacja: Metoda wymieniona w pierwotnej odpowiedzi jest przestarzała, zamiast tego powinniśmy użyć nowego sposobu:
Oryginalna odpowiedź:
możesz użyć scipy.stats.itemfreq
źródło
Byłem również tym zainteresowany, więc zrobiłem małe porównanie wydajności (używając perfplot , mojego projektu dla zwierząt domowych). Wynik:
jest zdecydowanie najszybszy. (Zwróć uwagę na skalowanie dziennika).
Kod do wygenerowania wykresu:
źródło
equality_check=array_sorteq
wperfplot.show()
. Przyczyną błędu (w Pythonie 2) byłopd.value_counts
(nawet z sort = False).Za pomocą modułu pandy:
źródło
Jest to zdecydowanie najbardziej ogólne i wydajne rozwiązanie; zaskoczony, że nie został jeszcze opublikowany.
W przeciwieństwie do obecnie akceptowanej odpowiedzi, działa na każdym typie danych, który jest sortowalny (nie tylko na dodatnich liczbach całkowitych) i ma optymalną wydajność; jedynym znaczącym wydatkiem jest sortowanie wykonane przez np.unique.
źródło
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
jest prawdopodobnie najlepszym wyborem. Jeśli tablica zawiera coś poza małymi gęstymi liczbami całkowitymi, przydatne może być zawinięcie jej w następujący sposób:Na przykład:
źródło
Mimo że zostało już udzielone odpowiedzi, sugeruję inne podejście, które wykorzystuje
numpy.histogram
. Taka funkcja, biorąc pod uwagę sekwencję, zwraca częstotliwość elementów zgrupowanych w przedziałach .Uwaga : działa w tym przykładzie, ponieważ liczby są liczbami całkowitymi. Jeśli byłyby to liczby rzeczywiste, to rozwiązanie nie miałoby tak dobrego zastosowania.
źródło
To daje: {1: 5, 2: 3, 5: 1, 25: 1}
źródło
collections.Counter(x)
dają również ten sam wynik. Wierzę, że OP chce wyjścia, które przypominatable
funkcję R. ZachowanieSeries
może być bardziej przydatne.pd.Series(x).reshape(-1)
jeśli jest to tablica wielowymiarowa.Aby policzyć unikalne liczby całkowite - podobne do odpowiedzi Eelco Hoogendoorna, ale znacznie szybsze (współczynnik 5 na mojej maszynie), zwykłem
weave.inline
łączyć sięnumpy.unique
z odrobiną kodu c;Informacje o profilu
Czysta
numpy
wersja Eelco :Uwaga
Jest tu nadmiarowość (
unique
wykonuje również sortowanie), co oznacza, że kod można by prawdopodobnie zoptymalizować, umieszczającunique
funkcjonalność w pętli c-code.źródło
Stare pytanie, ale chciałbym podać własne rozwiązanie, które okazuje się najszybsze,
list
zamiast tego używaj normalnegonp.array
wejściowego (lub najpierw przenieś do listy), w oparciu o mój test laboratoryjny.Sprawdź to, jeśli go spotkasz.
Na przykład,
100000 pętli, najlepiej 3: 2,26 µs na pętlę
100000 pętli, najlepiej 3: 8,8 µs na pętlę
100000 pętli, najlepiej 3: 5,85 µs na pętlę
Chociaż przyjęta odpowiedź byłaby wolniejsza, a
scipy.stats.itemfreq
rozwiązanie jest jeszcze gorsze.Bardziej szczegółowe badanie nie potwierdziło sformułowanych oczekiwań.
Nr ref. komentarze poniżej dotyczące pamięci podręcznej i innych skutków ubocznych w pamięci RAM, które wpływają na mały zestaw danych masowo powtarzających się wyników testów.
źródło
numpy
niekoniecznie jest to najlepsza droga.coś takiego powinno to zrobić:
Również ten poprzedni post na temat Skutecznie liczących unikalne elementy wydaje się bardzo podobny do twojego pytania, chyba że coś mi umknie.
źródło
wielowymiarowa liczba częstotliwości, tj. tablice zliczające.
źródło
źródło
źródło