값보다 큰 행렬의 모든 값 계산
200보다 큰 행렬 (2 차원 배열)의 모든 값을 계산해야합니다.
내가 적어 놓은 코드는 다음과 같습니다.
za=0
p31 = numpy.asarray(o31)
for i in range(o31.size[0]):
for j in range(o32.size[1]):
if p31[i,j]<200:
za=za+1
print za
o31
이미지이고 매트릭스로 변환 한 다음 값을 찾습니다.
내 질문은 이것을 수행하는 더 간단한 방법이 있습니까?
numpy.where
기능은 당신의 친구입니다. 배열 데이터 유형을 최대한 활용하도록 구현 되었기 때문에 큰 이미지의 경우 제공하는 순수한 Python 솔루션보다 속도가 향상되었음을 알 수 있습니다.
numpy.where를 직접 사용하면 특정 값이 조건과 일치하는지 여부를 나타내는 부울 마스크가 생성됩니다.
>>> data
array([[1, 8],
[3, 4]])
>>> numpy.where( data > 3 )
(array([0, 1]), array([1, 1]))
그리고 마스크는 실제 값을 얻기 위해 배열을 직접 인덱싱하는 데 사용할 수 있습니다.
>>> data[ numpy.where( data > 3 ) ]
array([8, 4])
정확한 위치는 결과를 원하는 형태에 따라 다릅니다.
부울 배열을 사용하면 매우 간단합니다.
p31 = numpy.asarray(o31)
za = (p31 < 200).sum() # p31<200 is a boolean array, so `sum` counts the number of True elements
이를 달성하는 방법은 flatten-and-filter 또는 단순히 열거와 같이 여러 가지가 있지만 Boolean / mask 배열을 사용하는 것이 가장 쉬운 방법 이라고 생각합니다 (그리고 iirc가 훨씬 더 빠름).
>>> 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
업데이트 :
nneonneo가 대답했듯이 임계 값을 통과하는 요소의 수만 원하는 경우 다음을 수행 할 수 있습니다.
>>>> (y>200).sum()
3
더 간단한 해결책입니다.
속도 비교 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
다음은 고급 인덱싱을 사용하고 실제 값을 중간으로 사용하는 변형입니다.
p31 = numpy.asarray(o31)
values = p31[p31<200]
za = len(values)
numpy 배열에서 x보다 큰 값의 수를 계산하려면 다음을 사용할 수 있습니다.
n = len(matrix[matrix > x])
부울 인덱싱은 조건 (행렬> x)이 충족되는 요소 만 포함하는 배열을 반환합니다. 그런 다음 len ()은 이러한 값을 계산합니다.
참고 URL : https://stackoverflow.com/questions/12995937/count-all-values-in-a-matrix-greater-than-a-value
'IT Share you' 카테고리의 다른 글
플롯 영역에 상대적인 범례 배치, ggplot (0) | 2020.12.13 |
---|---|
두 UIImage 객체를 비교하는 방법 (0) | 2020.12.13 |
트위터 부트 스트랩 다중 모달 오류 (0) | 2020.12.13 |
Docker Hello-world : 인증 오류 (0) | 2020.12.13 |
누구든지 StandardScaler를 설명 할 수 있습니까? (0) | 2020.12.13 |