[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.
>>> 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.
>>> 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.가장 빠르고 (가장 유연한) 방법은 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.다음과 같이 한 단계로 마스크 배열을 만들 수 있습니다.
다음과 같이 한 단계로 마스크 배열을 만들 수 있습니다.
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.나는 당신의 질문을 이해할 수있을 지 모르겠다.
나는 당신의 질문을 이해할 수있을 지 모르겠다.
mask_data[:3, :3] = 1 mask_data[3:, 3:] = 0
이렇게하면 x 및 y 인덱스가 3보다 작은 마스크 데이터의 모든 값을 1로 만들고 나머지는 모두 0과 같게 만듭니다.
from https://stackoverflow.com/questions/19766757/replacing-numpy-elements-if-condition-is-met by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python은 일치하는 내용으로 다시 대체합니다. (0) | 2018.11.04 |
---|---|
[PYTHON] ticklabels과 matplotlib의 축 사이에 공백을 어떻게 추가합니까? (0) | 2018.11.04 |
[PYTHON] 파이썬에서 "홈 디렉토리"를 찾으십니까? [복제] (0) | 2018.11.04 |
[PYTHON] 파이썬 : smtplib 모듈을 사용하여 전자 메일을 보낼 때 "제목"이 표시되지 않음 (0) | 2018.11.04 |
[PYTHON] 장고 관리자에서 기본 응용 프로그램을 제거하십시오 (0) | 2018.11.04 |