W Pythonie mam ndarray, y
który jest wydrukowany jakoarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Próbuję policzyć, ile 0
s i ile 1
jest w tej tablicy.
Ale kiedy piszę y.count(0)
lub y.count(1)
, mówi
numpy.ndarray
obiekt nie ma atrybutucount
Co powinienem zrobić?
python
numpy
multidimensional-array
count
mflowww
źródło
źródło
numpy.count_nonzero
.Odpowiedzi:
Sposób nienumeryczny :
Użyj
collections.Counter
;źródło
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
zadziałało dobrzeCo z używaniem
numpy.count_nonzero
, coś takiegoźródło
numpy.ndarray
jak pierwotnie poprosił OP.Osobiście wybrałbym:
(y == 0).sum()
i(y == 1).sum()
Na przykład
źródło
sum( vector==value )
W twoim przypadku możesz także zajrzeć na numpy.bincount
źródło
Konwertuj tablicę
y
na listę,l
a następnie wykonajl.count(1)
il.count(0)
źródło
Jeśli wiesz, że są one sprawiedliwe
0
i1
:daje liczbę tych.
np.sum(1-y)
daje zera.Dla drobnej ogólności, jeśli chcesz liczyć,
0
a nie zero (ale prawdopodobnie 2 lub 3):podaje liczbę niezerową.
Ale jeśli potrzebujesz czegoś bardziej skomplikowanego, nie sądzę, że numpy zapewni dobrą
count
opcję. W takim przypadku przejdź do kolekcji:To działa jak dyktat
źródło
Jeśli wiesz dokładnie, którego numeru szukasz, możesz użyć następujących;
zwraca ile razy 2 wystąpiło w twojej tablicy.
źródło
Szczerze mówiąc, najłatwiej jest mnie przekonwertować na serię pand lub DataFrame:
Lub ten ładny jednowarstwowy zasugerowany przez Roberta Muila:
źródło
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Nikt nie sugeruje, aby skorzystać
numpy.bincount(input, minlength)
zminlength = np.size(input)
, ale wydaje się być dobrym rozwiązaniem i zdecydowanie najszybszy :To szalone przyspieszenie między
numpy.unique(x, return_counts=True)
inumpy.bincount(x, minlength=np.max(x))
!źródło
np.histogram
nie oblicza tego samego.histogram
Przykro mi, nie ma sensu porównywać trzech podejść, które proponuję z funkcją.bincount
działa jednak tylko dla liczb całkowitych, więc działa na problem PO, ale może nie na ogólny problem opisany w tytule. Czy próbowałeś także używaćbincount
tablic z bardzo dużymi intami?bincount
jest około cztery razy szybszy niżunique
.Co z
len(y[y==0])
ilen(y[y==1])
?źródło
y.tolist().count(val)
z wartością 0 lub 1
Ponieważ lista python ma funkcję natywną
count
, konwersja do listy przed użyciem tej funkcji jest prostym rozwiązaniem.źródło
Jeszcze innym prostym rozwiązaniem może być użycie numpy.count_nonzero () :
Nie pozwól, aby nazwa wprowadziła cię w błąd, jeśli użyjesz go z wartością logiczną, tak jak w przykładzie, to załatwi sprawę.
źródło
Aby policzyć liczbę wystąpień, możesz użyć
np.unique(array, return_counts=True)
:źródło
Użyłbym np. Gdzie:
źródło
skorzystaj z metod oferowanych przez serię:
źródło
Ogólna i prosta odpowiedź brzmiałaby:
co w rezultacie dałoby pełny kod
Teraz, jeśli MyArray ma wiele wymiarów i chcesz policzyć występowanie rozkładu wartości w linii (= wzór poniżej)
źródło
Możesz użyć rozumienia słownikowego, aby stworzyć schludny jedno-liniowy. Więcej informacji na temat rozumienia słownika można znaleźć tutaj
Spowoduje to utworzenie słownika z wartościami w twoim ndarray jako kluczach i zliczeniami wartości odpowiednio jako wartości kluczy.
Działa to zawsze, gdy chcesz policzyć wystąpienia wartości w tablicach tego formatu.
źródło
Spróbuj tego:
źródło
Można to łatwo zrobić w następujący sposób
źródło
Ponieważ twoja ndarray zawiera tylko 0 i 1, możesz użyć sum (), aby uzyskać wystąpienie 1s, a len () - sum (), aby uzyskać wystąpienie 0.
źródło
Masz tutaj specjalną tablicę z tylko 1 i 0. Tak więc sztuczka polega na użyciu
co daje procent 1s w tablicy. Alternatywnie użyj
da ci absolutną liczbę 1 i 0 w twojej tablicy.
źródło
Właśnie skopiowałem tutaj komentarz Seppo Enarvi, który zasługuje na właściwą odpowiedź
źródło
Wymaga to jeszcze jednego kroku, ale bardziej elastycznym rozwiązaniem, które działałoby również w przypadku tablic 2D i bardziej skomplikowanych filtrów, jest utworzenie maski logicznej, a następnie użycie .sum () na masce.
źródło
Jeśli nie chcesz używać numpy lub modułu kolekcji, możesz użyć słownika:
wynik:
Oczywiście możesz także użyć instrukcji if / else. Myślę, że funkcja Licznik robi prawie to samo, ale jest to bardziej przejrzyste.
źródło
W przypadku wpisów ogólnych:
Wyświetli liczbę:
I indeksy:
źródło
tutaj mam coś, przez co można policzyć liczbę wystąpień określonej liczby: zgodnie z kodem
count_of_zero = lista (y [y == 0]). count (0)
print (liczba_zero)
// zgodnie z dopasowaniem będą wartości logiczne, a zgodnie z wartością True liczba 0 zostanie zwrócona
źródło
Jeśli jesteś zainteresowany najszybszym wykonaniem, wiesz z góry, jakich wartości szukać, a twoja tablica ma wartość 1D, lub w inny sposób interesuje Cię wynik na spłaszczonej tablicy (w takim przypadku wejście funkcji powinno bądź
np.flatten(arr)
raczej niż tylkoarr
), wtedy Numba jest twoim przyjacielem:lub, w przypadku bardzo dużych tablic, w których równoległość może być korzystna:
Porównywanie ich z
np.count_nonzero()
(co ma również problem z utworzeniem tymczasowej tablicy, której można uniknąć) inp.unique()
oparte na rozwiązaniudla danych wejściowych wygenerowanych za pomocą:
uzyskiwane są następujące wykresy (drugi rząd wykresów stanowi przybliżenie przy szybszym podejściu):
Pokazując, że rozwiązania oparte na Numbie są zauważalnie szybsze niż odpowiedniki NumPy, a przy bardzo dużych nakładach podejście równoległe jest szybsze niż naiwne.
Pełny kod dostępny tutaj .
źródło
jeśli masz do czynienia z bardzo dużymi tablicami, używanie generatorów może być opcją. Fajne jest to, że to podejście działa dobrze zarówno dla tablic, jak i list, i nie potrzebujesz żadnego dodatkowego pakietu. Ponadto nie używasz tyle pamięci.
źródło
Numpy ma do tego moduł. Tylko mały hack. Umieść tablicę wejściową jako pojemniki.
Dane wyjściowe to 2 tablice. Jedna z samymi wartościami, druga z odpowiednimi częstotliwościami.
źródło
źródło