조건이 충족되면 각 요소가 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이됩니다.