복붙노트

[PYTHON] 조건이 충족되면 울퉁불퉁 한 요소 교체하기

PYTHON

조건이 충족되면 울퉁불퉁 한 요소 교체하기

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

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

이 속도가 빨라지는 멍청한 기능이 있습니까?

해결법

  1. ==============================

    1.

    >>> 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)
    
  2. ==============================

    2.

    >>> 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]])
    >>>
    

    예를 들어 부울 배열을 사용한 인덱싱을 참조하십시오.

  3. ==============================

    3.가장 빠르고 (가장 유연한) 방법은 np.where를 사용하는 것입니다. np.where는 마스크 (true 및 false 값의 배열)에 따라 두 배열 중에서 선택합니다.

    가장 빠르고 (가장 유연한) 방법은 np.where를 사용하는 것입니다. np.where는 마스크 (true 및 false 값의 배열)에 따라 두 배열 중에서 선택합니다.

    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]]
    
  4. ==============================

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

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

    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)
    >>> 
    
  5. ==============================

    5.나는 당신의 질문을 이해할 수있을 지 모르겠다.

    나는 당신의 질문을 이해할 수있을 지 모르겠다.

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

    이렇게하면 x 및 y 인덱스가 3보다 작은 마스크 데이터의 모든 값을 1로 만들고 나머지는 모두 0과 같게 만듭니다.

  6. from https://stackoverflow.com/questions/19766757/replacing-numpy-elements-if-condition-is-met by cc-by-sa and MIT license