IT Share you

값보다 큰 행렬의 모든 값 계산

shareyou 2020. 12. 13. 11:26
반응형

값보다 큰 행렬의 모든 값 계산


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

반응형