반응형
조건이 충족되는 경우 Numpy 요소 교체
조건이 충족되면 각 요소가 1 또는 0으로 변경되도록 조작해야 하는 큰 numpy 배열이 있습니다(나중에 픽셀 마스크로 사용됨).어레이에는 약 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
이 속도를 높일 수 있는 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를 사용하는 것입니다.여기서, 마스크(참 및 거짓 값 배열)에 따라 두 배열 중에서 선택합니다.
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)
>>>
저는 Numpy의 초보자였고, 위의 답변은 제 배열을 수정할 정도로 간단하지 않습니다. 그래서 제가 생각해낸 것을 게시합니다.
import numpy as np
arr = np.array([[[10,20,30,255],[40,50,60,255]],
[[70,80,90,255],[100,110,120,255]],
[[170,180,190,255],[230,240,250,255]]])
# Change 1:
# Set every value to 0 if first element is smaller than 80
arr[arr[:,:,0] < 80] = 0
print('Change 1:',arr,'\n')
# Change 2:
# Set every value to 1 if bigger than 180 and smaller than 240
# OR if equal to 170
arr[(arr > 180) & (arr < 240) | (arr == 170)] = 1
print('Change 2:',arr)
이를 통해 다음과 같은 이점을 얻을 수 있습니다.
Change 1: [[[ 0 0 0 0]
[ 0 0 0 0]]
[[ 0 0 0 0]
[100 110 120 255]]
[[170 180 190 255]
[230 240 250 255]]]
Change 2: [[[ 0 0 0 0]
[ 0 0 0 0]]
[[ 0 0 0 0]
[100 110 120 255]]
[[ 1 180 1 255]
[ 1 240 250 255]]]
이렇게 하면 '변경 2'와 같은 수많은 조건을 추가하고 그에 따라 값을 설정할 수 있습니다.
제가 당신의 질문을 이해했는지는 모르겠지만, 만약 당신이 다음과 같이 쓴다면:
mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0
이렇게 하면 x 및 y 인덱스가 3 미만인 마스크 데이터의 모든 값이 1이고 나머지 값은 모두 0입니다.
언급URL : https://stackoverflow.com/questions/19766757/replacing-numpy-elements-if-condition-is-met
반응형
'sourcecode' 카테고리의 다른 글
여러 키로 개체를 정렬하는 방법은 무엇입니까? (0) | 2023.07.22 |
---|---|
사전을 사용하여 matplotlib를 사용하여 막대 그림 그리기 (0) | 2023.07.22 |
일부 행을 업데이트하는 동안 고유 키 무시(mariaDB) (0) | 2023.07.22 |
스프링 부트의 다중 변환 서비스 (0) | 2023.07.22 |
C에서 인쇄 매크로 디버그? (0) | 2023.07.22 |