2017-12-24 9 views
2

이 질문의 제목은 어떻게해야 할 지 모르겠습니다. 하지만 경계 밖으로 값의 일부를 가질 수없는 배열을 어떻게 얻을 수 있습니까?numpy 배열의 범위를 벗어난 부분을 채우십시오.

은 아래에있는 내 간단한 예제 코드를 참조하십시오 :

def get_section(a, center, square_radius): 
    return a[center[0] - square_radius:center[0] + square_radius + 1, \ 
       center[1] - square_radius:center[1] + square_radius + 1] 



array = [ 
    [1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [2, 3, 4, 5, 6, 7, 8, 9, 1], 
    [3, 4, 5, 0, 7, 8, 9, 1, 2], 
    [4, 5, 6, 7, 8, 9, 1, 2, 3], 
    [5, 0, 7, 8, 9, 4, 5, 6, 7], 
    [6, 7, 8, 9, 1, 2, 3, 4, 5] 
] 
a = np.asarray(array) 
square_radius = 2 


center = [2,3] 
print(get_section(a, center, square_radius)) 

center = [4,1] 
print(get_section(a, center, square_radius)) 

내가 배열을 가지고 말을하지만, 나는 중심과 내가 원하는 부분의 반경을 지정하여, 그것의 작은 부분을 좀하고 싶습니다 .

첫 번째 인쇄됩니다

[[2 3 4 5 6] 
[3 4 5 6 7] 
[4 5 0 7 8] 
[5 6 7 8 9] 
[0 7 8 9 4]] 

을 내가 원하는 정확히 어느. 간단히하기 위해, 나는 식별 된 2 개의 예 가운데에 '0'을 두었다.

그러나 두 번째는 내가 -1 외부 값을 입력하고자하는 두 번째의 경우 []

을 인쇄합니다. 따라서 반환하겠습니다.

[[-1 3 4 5 0] 
[-1 4 5 6 7] 
[-1 5 0 7 8] 
[-1 6 7 8 9] 
[-1 -1 -1 -1 -1]] 

numpy로 어떻게 할 수 있습니까?

답변

1

마침내! 나는 np.pad을 사용하여 그것을했다. 나는 그것이 매우 복잡 었죠으로이 일을 더 나은 방법이 있는지 확실하지 않다, 그럼에도 불구하고, 그것을 잘 작동합니다 : 당신의 예제와 함께

def get_section(a, center, square_radius): 
    tp = max(0, -(center[0] - square_radius)) 
    bp = max(0, -((a.shape[0]-center[0]-1) - square_radius)) 
    lp = max(0, -(center[1] - square_radius)) 
    rp = max(0, -((a.shape[1]-center[1]-1) - square_radius)) 
    a = np.pad(a, [[tp, bp], [lp, rp]], 'constant', constant_values=-1) 
    return a[center[0] - square_radius + tp:center[0] + square_radius + 1 + tp, \ 
       center[1] - square_radius + lp:center[1] + square_radius + 1 + lp] 

및 테스트 :

>>> center = [2,3] 
>>> print(get_section(a, center, square_radius)) 
[[2 3 4 5 6] 
[3 4 5 6 7] 
[4 5 0 7 8] 
[5 6 7 8 9] 
[0 7 8 9 4]] 
>>> center = [4,1] 
>>> print(get_section(a, center, square_radius)) 
[[-1 3 4 5 0] 
[-1 4 5 6 7] 
[-1 5 0 7 8] 
[-1 6 7 8 9] 
[-1 -1 -1 -1 -1]] 

왜?

먼저,이 np.pad() 기능을 테스트하는 배열을 정의 할 수 있습니다 :

>>> a 
array([[1, 2], 
     [3, 4]]) 

을 그리고 우리는 패딩 작품, 그것은 상당히 자기 설명이 예에서 어떻게해야의 빠른 데모를 수행 할 수 있습니다

>>> np.pad(a, [[1, 2], [0, 3]], 'constant', constant_values=-1) 
array([[-1, -1, -1, -1, -1], 
     [ 1, 2, -1, -1, -1], 
     [ 3, 4, -1, -1, -1], 
     [-1, -1, -1, -1, -1], 
     [-1, -1, -1, -1, -1]]) 

그래서 우리가 지금 우리가 원하는대로 가장자리 우리는 우리가 지금 단지 우리가 할 경우 운동 필요로 -1s을 추가 할 수 있다는 것을 알고 그렇다면, 어떻게, (광장은 두 번째 예에서와 같이 가장자리를 중복) 및 많은 것 -1s 각 가장자리에 추가해야합니다.

이러한 패딩 거리는 몇 가지 계산을 수행하여 기능의 상단 (tp, bp, ... 상단 패드, 하단 패드 ...)에 정의됩니다.

계산은 기본적으로 가장자리와 중심 사이의 거리를 취하고 square_radius을 뺀 것입니다. 그러나 우리가 이것을 남겨두면 음의 패딩 거리를 얻게됩니다 (반경이 가장자리까지의 거리보다 작 으면이 문제를 해결하기 위해 0과 함께 max() 함수를 사용하여 패딩을 만듭니다). 거리는 양수 (패딩이 필요) 또는 0 (패딩은 그 가장자리에 필요 없음).

이 모든 것을 정의한 후에 함수를 a에 호출하면됩니다.

마지막으로 원래의 '정사각형 추출'기술을 사용하여 중심 좌표를 정사각형으로 만듭니다. 유일한 차이점은 위쪽 패드와 왼쪽 패드로 모든 인덱스를 오프셋해야한다는 것입니다. 우리는 단지 3의 왼쪽 패드를 덧대는 것으로 채워진 것처럼, 이렇게해야합니다. 원래 4의 중심이었던 것이 이제는 1의 중심이됩니다 (인덱스가 패딩 가장자리에서 시작됨). 따라서이 문제를 해결하기 위해 모든 인덱스에 패딩 차이점을 추가하여 인덱스를 다시 오프셋합니다.

잘하면 지금 받으실 수 있습니다!

+0

네, 어떻게 작동하는지 이해하려고합니다. 힘든 시간을 보내고. np.pad에 대한 정보를 읽었고 왼쪽/오른쪽 및 위쪽/아래쪽을 패드하는 방법을 얻었습니다. 하지만, 'a'는 np.pad 기능 전후에 'a'를 인쇄 할 때 바뀌지 않는 것 같습니다. 나는 왜 tp와 lp를 추가하는 것이 트릭을하는지 이해하지 못한다. 나는 그것이 효과가 있고, 이해하려고 노력한다는 것을 압니다. 감사합니다 – user1179317

+0

@ user1179317 설명을 추가했습니다. –

+0

나는 그것을 얻었다 고 생각한다. 반환되는 값이 원래 배열의 경계 내에있는 값이므로 패딩이 해당 섹션에 추가되므로 거의 생각할 수 있습니다. 코드를 따라갈 때 패딩이 추가 된 것처럼 보이기 때문에 조금 혼란 스럽지만 추가 패딩을 무시하고 값을 반환하기 만합니다. – user1179317