Istnieje wiele sposobów osiągnięcia tego celu, np. Latten filtrujący lub po prostu wymienić, ale myślę, że za pomocą Boolean/mask array jest najprostszym jeden (i IIRC znacznie szybciej jeden):
>>> y = np.array([[123,24123,32432], [234,24,23]])
array([[ 123, 24123, 32432],
[ 234, 24, 23]])
>>> b = y > 200
>>> b
array([[False, True, True],
[ True, False, False]], dtype=bool)
>>> y[b]
array([24123, 32432, 234])
>>> len(y[b])
3
>>>> y[b].sum()
56789
Aktualizacja:
Jak nneonneo odpowiedział, jeśli wszystko Chcesz, aby liczba elementów przekroczyła próg, wystarczy:
>>>> (y>200).sum()
3
co jest prostszym rozwiązaniem.
porównanie prędkości z filter
:
### use boolean/mask array ###
b = y > 200
%timeit y[b]
100000 loops, best of 3: 3.31 us per loop
%timeit y[y>200]
100000 loops, best of 3: 7.57 us per loop
### use filter ###
x = y.ravel()
%timeit filter(lambda x:x>200, x)
100000 loops, best of 3: 9.33 us per loop
%timeit np.array(filter(lambda x:x>200, x))
10000 loops, best of 3: 21.7 us per loop
%timeit filter(lambda x:x>200, y.ravel())
100000 loops, best of 3: 11.2 us per loop
%timeit np.array(filter(lambda x:x>200, y.ravel()))
10000 loops, best of 3: 22.9 us per loop
*** use numpy.where ***
nb = np.where(y>200)
%timeit y[nb]
100000 loops, best of 3: 2.42 us per loop
%timeit y[np.where(y>200)]
100000 loops, best of 3: 10.3 us per loop
Czy to nie wystarczy wydrukować liczbę wartości mniej niż 200, a nie rzeczywistych wartości? –
Tak. Po prostu potrzebuję sumy wszystkich wartości zamiast samych wartości rzeczywistych. –
Tutaj też nie ma całkowitej sumy. Ustaw 'za' na pustą listę' za = [] ', następnie' za.append (p31 [i, j]) ', w końcu z pętli for,' print sum (za) '; ale jestem pewien, że jest lepszy sposób, ponieważ używasz numpy. –