Python 은 NumPy 배열 에서 어떤 값 보다 큰 모든 요소 인 스 턴 스 를 대체 합 니 다.

저 는 2D(2 차원)NumPy 배열 이 있 고 문턱 값 T 보다 크 거나 같은 모든 값 을 255.0 으로 교체 하고 싶 습 니 다.내 가 알 기 로 는 가장 기본 적 인 방법 은:

shape = arr.shape
result = np.zeros(shape)
for x in range(0, shape[0]):
 for y in range(0, shape[1]):
 if arr[x, y] >= T:
 result[x, y] = 255
좀 더 간결 하고 pythonic 하 는 방법 이 있 나 요?
더 빨리(그렇게 간결 하지 않 거나/그렇게 pythonic 하지 않 을 수도 있 습 니 다)할 수 있 는 방법 이 있 습 니까?
이 는 인체 머리 MRI 스 캔 창/등급 조정 서브루틴 의 일부 가 되 며 2D numpy 배열 은 이미지 픽 셀 데이터 입 니 다.

최선 의 해결 방향.
가장 빠 르 고 간결 한 방법 은 Numpy 의 내장 색인 을 사용 하 는 것 이 라 고 생각 합 니 다.arr 라 고 불 리 는 ndarray 는 다음 과 같이 모든 요소>255 를 값 x 로 바 꿀 수 있 습 니 다.
arr[arr > 255] = x
나 는 500 x 500 의 랜 덤 행렬 로 나의 기계 에서 이 함 수 를 운행 하 였 으 며,5 로 모든>0.5 의 값 을 교체 하 였 으 며,평균 7.59ms 를 소모 하 였 다.

In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)
In [3]: timeit A[A > 0.5] = 5
100 loops, best of 3: 7.59 ms per loop
차선 의 해결 방향.
실제 적 으로 서로 다른 배열 이 필요 하기 때문에 arr,그 중에서 arr<255,간단하게 완성 할 수 있 습 니 다:
result = np.minimum(arr, 255)
더 일반적으로 하한 과/또는 상한 선:
result = np.clip(arr, 0, 255)
255 가 넘 는 값 에 만 접근 하려 면 np.clip 과 np.minimum(또는 np.maximum)이 더 빠 릅 니 다.

In [292]: timeit np.minimum(a, 255)
100000 loops, best of 3: 19.6 µs per loop
 
In [293]: %%timeit
 .....: c = np.copy(a)
 .....: c[a>255] = 255
 .....: 
10000 loops, best of 3: 86.6 µs per loop
in-place(즉,result 를 만 드 는 것 이 아니 라 arr 를 수정 하 는 것)를 실행 하려 면 np.minimum 의 out 인 자 를 사용 할 수 있 습 니 다.
np.minimum(arr, 255, out=arr)
혹은
np.clip(arr, 0, 255, arr)
(out=이름 은 선택 할 수 있 습 니 다.매개 변수의 순서 가 함수 의 정의 와 같 기 때 문 입 니 다.)
in-place 수정 에 있어 서 불 색인 은 많이 가속 화 되 었 습 니 다(각각 수정 과 복사 할 필요 가 없습니다).그러나 minimum 보다 못 합 니 다.

In [328]: %%timeit
 .....: a = np.random.randint(0, 300, (100,100))
 .....: np.minimum(a, 255, a)
 .....: 
100000 loops, best of 3: 303 µs per loop
 
In [329]: %%timeit
 .....: a = np.random.randint(0, 300, (100,100))
 .....: a[a>255] = 255
 .....: 
100000 loops, best of 3: 356 µs per loop
비교 해 보면 최대 치 와 최소 치 를 제한 하려 면 클립 이 없 으 면 아래 처럼 두 번 해 야 합 니 다.
np.minimum(a, 255, a)
np.maximum(a, 0, a)
아니면
a[a>255] = 255
a[a<0] = 0
세 번 째 해결 방향
where 기능 을 사용 하여 가장 빠 른 속 도 를 달성 할 수 있 습 니 다:
예 를 들 어 numpy 배열 에서 0.2 이상 의 항목 을 찾 고 0 으로 대체 합 니 다.

import numpy as np
nums = np.random.rand(4,3)
print np.where(nums > 0.2, 0, nums)
네 번 째 사고
numpy.putmask 사용 을 고려 할 수 있 습 니 다:
np.putmask(arr, arr>=T, 255.0)
다음은 Numpy 내장 색인 과 의 성능 비교 입 니 다.

In [1]: import numpy as np
In [2]: A = np.random.rand(500, 500)
 
In [3]: timeit np.putmask(A, A>0.5, 5)
1000 loops, best of 3: 1.34 ms per loop
 
In [4]: timeit A[A > 0.5] = 5
1000 loops, best of 3: 1.82 ms per loop
이상 의 Python 이 NumPy 배열 에서 어떤 값 보다 큰 모든 요소 인 스 턴 스 를 교체 하 는 것 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 실 수 있 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기