numpy – pad で配列にパディングを入れる方法

目次

概要

NumPy で配列にパディングを入れる numpy.pad の使い方について解説します。

関数一覧

numpy.pad

配列にパディングを入れます。

numpy.pad(array, pad_width, mode, **kwargs)
引数
名前 デフォルト値
array array_like of rank N
入力配列
pad_width {sequence, array_like, int}
各軸ごとのパディングする量。
mode str, function
パディング方式。
stat_length sequence int
パディング方式に “maximum”, “mean”, “median”, and “minimum” を選択した場合に、端から何個目の値までで統計量を計算するかを指定します。
constant_values sequence int
パディング方式に “constant” を選択した場合に、パディングする値を指定します。
end_values sequence int
パディング方式に “linear_ramp” を選択した場合に、端と end_values の間で線形補完してパディングします。
reflect_type {‘even’, ‘odd’}
パディング方式に “reflect”、”symmetric” を選択した場合の設定。
返り値
名前 説明
pad pad_width で指定した量だけパディングされた配列。

パディング幅の指定方法

各軸ごとに前後のパディング幅をそれぞれ指定する

pad_width=[((before_1, after_1), … (before_N, after_N))]

(before_i, after_i)axis=iindex=0 側に before_iindex=-1 側に after_i だけパディングすることを意味します。

In [1]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)

b = np.pad(a, [(2, 3), (0, 1)], "constant")
print(b)
[[ 0  0  0  0]
 [ 0  0  0  0]
 [10 10 10  0]
 [10 10 10  0]
 [10 10 10  0]
 [ 0  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  0]]

各軸ごとに前後同じパディング幅を指定する

pad_width=[(pad_1,), … (pad_N,)]

(pad_i,)axis=iindex=0 及び index=-1 両方に pad_i だけパディングすることを意味します。

In [2]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)
b = np.pad(a, [(1,), (2,)], "constant")
print(b)
[[ 0  0  0  0  0  0  0]
 [ 0  0 10 10 10  0  0]
 [ 0  0 10 10 10  0  0]
 [ 0  0 10 10 10  0  0]
 [ 0  0  0  0  0  0  0]]

すべての軸一括で前後のパディング幅をそれぞれ指定する

pad_width=[before, after]

すべての軸に index=0 側に beforeindex=-1 側に after だけパディングすることを意味します。

In [3]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)
b = np.pad(a, [1, 2], "constant")
print(b)
[[ 0  0  0  0  0  0]
 [ 0 10 10 10  0  0]
 [ 0 10 10 10  0  0]
 [ 0 10 10 10  0  0]
 [ 0  0  0  0  0  0]
 [ 0  0  0  0  0  0]]

すべての軸一括で前後同じパディング幅を指定する

pad_width=[before, after]

すべての軸の index=0 及び index=-1 両方に pad だけパディングすることを意味します。

In [4]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)
b = np.pad(a, 1, "constant")
print(b)
[[ 0  0  0  0  0]
 [ 0 10 10 10  0]
 [ 0 10 10 10  0]
 [ 0 10 10 10  0]
 [ 0  0  0  0  0]]

パディング方式

constant – 定数でパディングする

In [5]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)
b = np.pad(a, 1, "constant")
print(b)
[[ 0  0  0  0  0]
 [ 0 10 10 10  0]
 [ 0 10 10 10  0]
 [ 0 10 10 10  0]
 [ 0  0  0  0  0]]

edge – 端の値でパディングする

In [6]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "edge")
print(b)
[[0 0 0 1 2 2 2]
 [0 0 0 1 2 2 2]
 [0 0 0 1 2 2 2]
 [3 3 3 4 5 5 5]
 [6 6 6 7 8 8 8]
 [6 6 6 7 8 8 8]
 [6 6 6 7 8 8 8]]

linear_ramp – 線形補完してパディングする

端の値と `end_values の間で値を線形補完でパディングします。

In [7]:
import numpy as np

a = np.full((3, 3), 10, dtype=int)
b = np.pad(a, 5, "linear_ramp", end_values=0)
print(b)
[[ 0  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  1  1  2  2  2  1  1  0  0  0]
 [ 0  0  1  2  3  4  4  4  3  2  1  0  0]
 [ 0  1  2  3  4  6  6  6  4  3  2  1  0]
 [ 0  1  3  4  6  8  8  8  6  4  3  1  0]
 [ 0  2  4  6  8 10 10 10  8  6  4  2  0]
 [ 0  2  4  6  8 10 10 10  8  6  4  2  0]
 [ 0  2  4  6  8 10 10 10  8  6  4  2  0]
 [ 0  1  3  4  6  8  8  8  6  4  3  1  0]
 [ 0  1  2  3  4  6  6  6  4  3  2  1  0]
 [ 0  0  1  2  3  4  4  4  3  2  1  0  0]
 [ 0  0  0  1  1  2  2  2  1  1  0  0  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0]]

maximum – 最大値でパディングする

軸ごとに最大値でパディングします。

In [8]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "maximum")
print(b)
[[8 8 6 7 8 8 8]
 [8 8 6 7 8 8 8]
 [2 2 0 1 2 2 2]
 [5 5 3 4 5 5 5]
 [8 8 6 7 8 8 8]
 [8 8 6 7 8 8 8]
 [8 8 6 7 8 8 8]]

minimum – 最小値でパディングする

軸ごとに最小値でパディングします。

In [9]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "minimum")
print(b)
[[0 0 0 1 2 0 0]
 [0 0 0 1 2 0 0]
 [0 0 0 1 2 0 0]
 [3 3 3 4 5 3 3]
 [6 6 6 7 8 6 6]
 [0 0 0 1 2 0 0]
 [0 0 0 1 2 0 0]]

mean – 最小値でパディングする

軸ごとに平均値でパディングします。

In [10]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "mean")
print(b)
[[4 4 3 4 5 4 4]
 [4 4 3 4 5 4 4]
 [1 1 0 1 2 1 1]
 [4 4 3 4 5 4 4]
 [7 7 6 7 8 7 7]
 [4 4 3 4 5 4 4]
 [4 4 3 4 5 4 4]]

median – 最小値でパディングする

軸ごとに中央値でパディングします。

In [11]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "median")
print(b)
[[4 4 3 4 5 4 4]
 [4 4 3 4 5 4 4]
 [1 1 0 1 2 1 1]
 [4 4 3 4 5 4 4]
 [7 7 6 7 8 7 7]
 [4 4 3 4 5 4 4]
 [4 4 3 4 5 4 4]]

reflect – 端で折り返してパディングする

軸ごとに端で折り返してパディングします。

In [12]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 4, "reflect")
print(b)
[[0 1 2 1 0 1 2 1 0 1 2]
 [3 4 5 4 3 4 5 4 3 4 5]
 [6 7 8 7 6 7 8 7 6 7 8]
 [3 4 5 4 3 4 5 4 3 4 5]
 [0 1 2 1 0 1 2 1 0 1 2]
 [3 4 5 4 3 4 5 4 3 4 5]
 [6 7 8 7 6 7 8 7 6 7 8]
 [3 4 5 4 3 4 5 4 3 4 5]
 [0 1 2 1 0 1 2 1 0 1 2]
 [3 4 5 4 3 4 5 4 3 4 5]
 [6 7 8 7 6 7 8 7 6 7 8]]

symmetric – 端で折り返してパディングする

軸ごとに端で折り返してパディングします。"reflect" と違い、端の値は繰り返されます。

In [13]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 4, "symmetric")
print(b)
[[8 8 7 6 6 7 8 8 7 6 6]
 [8 8 7 6 6 7 8 8 7 6 6]
 [5 5 4 3 3 4 5 5 4 3 3]
 [2 2 1 0 0 1 2 2 1 0 0]
 [2 2 1 0 0 1 2 2 1 0 0]
 [5 5 4 3 3 4 5 5 4 3 3]
 [8 8 7 6 6 7 8 8 7 6 6]
 [8 8 7 6 6 7 8 8 7 6 6]
 [5 5 4 3 3 4 5 5 4 3 3]
 [2 2 1 0 0 1 2 2 1 0 0]
 [2 2 1 0 0 1 2 2 1 0 0]]

wrap – 端で折り返してパディングする

軸ごとに値を繰り返してパディングします。

In [14]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "wrap")
print(b)
[[4 5 3 4 5 3 4]
 [7 8 6 7 8 6 7]
 [1 2 0 1 2 0 1]
 [4 5 3 4 5 3 4]
 [7 8 6 7 8 6 7]
 [1 2 0 1 2 0 1]
 [4 5 3 4 5 3 4]]

empty – 初期化されていない値でパディングする

初期化されていない値でパディングします。初期化されていないので、値は不定です。

In [15]:
import numpy as np

a = np.arange(9).reshape((3, 3))
b = np.pad(a, 2, "empty")
print(b)
[[4 5 3 4 5 3 4]
 [7 8 6 7 8 6 7]
 [1 2 0 1 2 0 1]
 [4 5 3 4 5 3 4]
 [7 8 6 7 8 6 7]
 [1 2 0 1 2 0 1]
 [4 5 3 4 5 3 4]]

コメント

コメントする

目次