2017-12-12 4 views
0

모양이 3x3, 5x5, , ... scipy.ndimage.rotate 인 다른 배열 (dtype : np.float32)을 회전시킵니다. 입력 배열은 항상 sum <= 1.0이고 대부분의 경우 합계 1.0에서 매우 작은 엡실론을 뺀 값과 같습니다. 이 배열의 최소값은 항상 >= 0.0입니다.배열 값을 특정 값/간격으로 변경 하시겠습니까?

[0.0, 1.0]의 결과 값이 항상 scipy.ndimage.rotate 인 배열을 가져와야하지만, 때때로 -1.0755285551056204e-16과 같이 매우 작은 음수 값을 가져 오는 경우가 종종있었습니다. 부동 소수점 숫자가 정확하지 않아서 나타납니다.

그러나 출력 배열의 값을 예상 간격 인 [0.0, 1.0]으로 스쿼시하고 싶습니다 (합계 < = 1.0 임). 가능한 한 빨리 (계산 시간) 어떻게 할 수 있습니까?

softmax과 같은 것은 이미 높은 값이 더욱 높아지는 방식으로 배열의 값을 다시 지수 화 (지수 적으로)하기 때문에 좋은 생각이 아닙니다.

일부 드문 경우로 scipy.ndimage.rotate의 반환 배열에도 sum> 1.0 (양수 float 부정확?!)이 있었으므로 sigmoid function을 사용하는 것이 좋지 않을 것입니다. 왜냐하면 값을 독립적으로 스케일링하기 때문입니다. 합계가 < = 1.0인지 확인하십시오.

+0

작은 음수 값은 본질적으로 0입니다. 행렬에'max (0, value)'를 적용해도 괜찮습니까? 합계는 여전히 1에서 작은 엡실론을 뺀 것입니다. – pault

+0

배열의 최소값을 빼는 경우 (최소값이 <0 인 경우 abs를 추가 한 다음 모든 값을 합계로 나누면 모든 값> = 0 및 합계 = 1이 얻어야합니다. 그러나이 목표를 성취 할 수있는 다른 방법이 있습니다. 그래서 당신이하는 일은 목표가 무엇인지에 정확히 의존 할 것입니다. – tom10

+0

@ tom10 이것은 합리적이고 빠른 방법처럼 들립니다. 또한 값이 서로 간의 관계를 잃지 않도록 할 것입니다. 맞습니까? – daniel451

답변

1

회전에는 스플라인 보간이 포함됩니다. 0과 1 사이의 값 보간은 때로는 [0,1] 간격을 벗어나는 값을 생성합니다. 이러한 편차가 작은 한 (그리고 작은 편), 그들에 대해 열심히 생각할 필요가 없습니다. numpy.clip 빠른 작업을 수행 할 것입니다.

image = np.clip(image, 0, 1) 

합계는 회전 후 배열 합계가 동일하지 않을 것으로 예상됩니다. reshape=False을 사용하면 이미지의 일부가 사라집니다. 그렇지 않은 경우 새 이미지는 다른 격자로 다시 보간되었으므로 이전 이미지와 정확히 동일한 값을 가지지 않습니다. 합계는 위 또는 아래로 갈 수 있습니다.

합계가 < = 1이므로 기하학적으로 자연스럽지 않으므로 지오 메트릭 방식으로 자연스럽게이를 보장 할 방법이 없습니다. 그래서 여러분은 원하는 대수 조작을 할 수 있습니다. 이와 같이 :

if image.sum() > 1: 
    image /= image.sum() 
관련 문제