달나라 노트

Python numpy : pad (array 테두리 데이터 추가. array 테두리 추가) 본문

Python/Python numpy

Python numpy : pad (array 테두리 데이터 추가. array 테두리 추가)

CosmosProject 2022. 3. 22. 18:53
728x90
반응형

 

 

 

numpy의 pad method는 대상 array의 테두리에 특정 데이터를 추가해줍니다.

 

Syntax

numpy.pad(array,
          pad_width=((a, b), (c, d)),
          mode='constant',
          constant_values=0
          )

array = pad method를 적용할 대상이 될 array입니다.

 

pad_width = 데이터를 추가해서 테두리를 몇줄이나 만들지를 지정하는 부분입니다.

a -> 위쪽 행 추가 개수

b -> 아래쪽 행 추가 개수

c -> 왼쪽 열 추가 개수

d -> 오른쪽 열 추가 개수

 

mode = pad method를 적용하는 mode를 지정합니다. 기본값은 constant입니다.

mode='constant' -> 특정한 값으로 테두리를 추가함.

mode='edge' -> 원본 array에서 가장 가까운 모서리(edge)에 있는 값으로 테두리 데이터를 추가함.

mode='maximum' -> 특정 테두리 위치에 존재하는 값에서 행/열에 있는 최대값으로 테두리 데이터를 추가함.

 

constant_values = 테두리에 채워넣을 상수값을 의미합니다. 기본값은 0입니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (1, 1)), mode='constant', constant_values=0)
print(arr_test_padded)


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

2차원 array를 생성했고 pad method를 적용하였습니다.

 

결과를 보면 원본 array의 주위로 0이라는 숫자가 채워져서 마치 2차원 array를 둘러싸는 테두리가 생긴걸 볼 수 있습니다.

 

 

 

 

 

 

아래는 pad_width 옵션을 조절한 예시들입니다.

pad_width 옵션에서 변화되는 값과 결과를 비교해서 pad_width옵션이 적용되는 위치를 중점적으로 보면 이해하기 쉽습니다.

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((3, 1), (1, 1)), mode='constant', constant_values=0)
print(arr_test_padded)


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

pad_width 값을 조절해서 위쪽에만 3줄의 padding을 추가한 결과입니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 3), (1, 1)), mode='constant', constant_values=0)
print(arr_test_padded)



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

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

pad_width 값을 조절해서 아래쪽에만 3줄의 padding을 추가한 결과입니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (3, 1)), mode='constant', constant_values=0)
print(arr_test_padded)


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

pad_width 값을 조절해서 왼쪽에만 3줄의 padding을 추가한 결과입니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (1, 3)), mode='constant', constant_values=0)
print(arr_test_padded)


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

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

pad_width 값을 조절해서 오른쪽에만 3줄의 padding을 추가한 결과입니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (0, 1)), mode='constant', constant_values=0)
print(arr_test_padded)


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

pad_width 값을 조절해서 왼쪽에는 padding을 추가하지 않은 결과입니다.

 

 

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (1, 1)), mode='constant', constant_values=10)
print(arr_test_padded)


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

constant_values 값을 10으로 변경한 결과입니다.

테두리의 값이 10으로 채워진 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (1, 1)), mode='edge')
print(arr_test_padded)


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

mode 옵션을 edge로 설정했습니다.

 

값이 채워져야하는 모서리의 위치 기준으로 가장 가까운 원본 행렬의 모서리(edge)에 있는 값으로 padding을 채웁니다.

 

 

 

import numpy as np

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

print(arr_test)

arr_test_padded = np.pad(arr_test, pad_width=((1, 1), (1, 1)), mode='maximum')
print(arr_test_padded)


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

mode 옵션을 maximum으로 설정했습니다.

 

값이 채워져야하는 모서리의 위치 기준으로 동일한 행 또는 열에 있는 값 중 가장 큰 값으로 padding을 채웁니다.

 

 

 

 

 

 

728x90
반응형
Comments