Python 은 NumPy 배열 에서 어떤 값 보다 큰 모든 요소 인 스 턴 스 를 대체 합 니 다.
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 배열 에서 어떤 값 보다 큰 모든 요소 인 스 턴 스 를 교체 하 는 것 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 실 수 있 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.