目次
概要
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=i
の index=0
側に before_i
、index=-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=i
の index=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
側に before
、index=-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]]
コメント