[python] 조건이 충족되면 Numpy 요소 교체

조건이 충족되면 각 요소가 1 또는 0으로 변경되도록 조작해야하는 큰 numpy 배열이 있습니다 (나중에 픽셀 마스크로 사용됨). 배열에는 약 8 백만 개의 요소가 있으며 현재 방법은 축소 파이프 라인에 너무 오래 걸립니다.

for (y,x), value in numpy.ndenumerate(mask_data):

    if mask_data[y,x]<3: #Good Pixel
        mask_data[y,x]=1
    elif mask_data[y,x]>3: #Bad Pixel
        mask_data[y,x]=0

속도를 높일 수있는 numpy 함수가 있습니까?



답변

>>> import numpy as np
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[4, 2, 1, 1],
       [3, 0, 1, 2],
       [2, 0, 1, 1],
       [4, 0, 2, 3],
       [0, 0, 0, 2]])
>>> b = a < 3
>>> b
array([[False,  True,  True,  True],
       [False,  True,  True,  True],
       [ True,  True,  True,  True],
       [False,  True,  True, False],
       [ True,  True,  True,  True]], dtype=bool)
>>> 
>>> c = b.astype(int)
>>> c
array([[0, 1, 1, 1],
       [0, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0],
       [1, 1, 1, 1]])

다음과 같이 단축 할 수 있습니다.

>>> c = (a < 3).astype(int)


답변

>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[0, 3, 3, 2],
       [4, 1, 1, 2],
       [3, 4, 2, 4],
       [2, 4, 3, 0],
       [1, 2, 3, 4]])
>>> 
>>> a[a > 3] = -101
>>> a
array([[   0,    3,    3,    2],
       [-101,    1,    1,    2],
       [   3, -101,    2, -101],
       [   2, -101,    3,    0],
       [   1,    2,    3, -101]])
>>>

예를 들어, 부울 배열로 인덱싱을 참조하십시오 .


답변

빠른 (가장 유연한) 방법을 사용하는 것이다 np.where 두 배열 중에서 선택 마스크 (참과 거짓 값의 배열)에있어서, 이는 :

import numpy as np
a = np.random.randint(0, 5, size=(5, 4))
b = np.where(a<3,0,1)
print('a:',a)
print()
print('b:',b)

다음을 생성합니다.

a: [[1 4 0 1]
 [1 3 2 4]
 [1 0 2 1]
 [3 1 0 0]
 [1 4 0 1]]

b: [[0 1 0 0]
 [0 1 0 1]
 [0 0 0 0]
 [1 0 0 0]
 [0 1 0 0]]


답변

다음과 같이 한 단계로 마스크 배열을 만들 수 있습니다.

mask_data = input_mask_data < 3

그러면 픽셀 마스크로 사용할 수있는 부울 배열이 생성됩니다. 코드 에서처럼 입력 배열을 변경하지 않았지만 마스크 데이터를 저장할 새 배열을 만들었습니다.이 방법을 사용하는 것이 좋습니다.

>>> input_mask_data = np.random.randint(0, 5, (3, 4))
>>> input_mask_data
array([[1, 3, 4, 0],
       [4, 1, 2, 2],
       [1, 2, 3, 0]])
>>> mask_data = input_mask_data < 3
>>> mask_data
array([[ True, False, False,  True],
       [False,  True,  True,  True],
       [ True,  True, False,  True]], dtype=bool)
>>> 


답변

질문을 이해했는지 잘 모르겠지만 다음과 같이 작성하면 :

mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0

이렇게하면 x 및 y 인덱스가 3보다 작은 마스크 데이터의 모든 값이 1이되고 나머지는 모두 0이됩니다.


답변