NumPy配列を効率的に繰り返し並べるnp.tile徹底解説
NumPyを使用していると、配列を特定のパターンで繰り返したり、拡張したりする場面によく遭遇します。そんな時に非常に便利なのが**np.tile**関数です。この記事では、np.tileの基本的な使い方から、具体的なサンプルコードを交えながらその強力な機能までを詳しく解説します。
np.tileとは?
np.tileは、NumPy配列を指定した回数だけ繰り返し、タイル状に並べて新しい配列を作成する関数です。データ拡張、特徴量エンジニアリング、シミュレーションなど、多岐にわたる場面で役立ちます。
書式
numpy.tile(A, reps)
-
A: 繰り返し並べたい元の配列(ndarray)。 -
reps: 各次元でAを繰り返す回数を指定します。-
整数: 全ての次元で指定した回数だけ繰り返します。
-
タプルまたは配列: 各次元ごとに繰り返す回数を指定します。
Aの次元数よりもrepsの要素数が少ない場合、先頭の次元から順に繰り返され、残りの次元は1回(繰り返さない)とみなされます。Aの次元数よりもrepsの要素数が多い場合、repsの先頭要素が無視され、残りの要素がAの各次元に対応します。
-
np.tileの基本的な使い方
まずは、最もシンプルなケースから見ていきましょう。
1. 1次元配列の繰り返し
1次元配列を繰り返す場合、repsに整数を指定すると、その回数だけ配列が連結されます。
サンプルコード
import numpy as np
arr_1d = np.array([1, 2, 3])
tiled_arr_1d = np.tile(arr_1d, 3)
print(tiled_arr_1d)
出力例
[1 2 3 1 2 3 1 2 3]
2. 2次元配列の繰り返し
2次元配列を繰り返す場合、repsにタプルを指定することで、行方向と列方向それぞれの繰り返し回数を制御できます。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2], [3, 4]])
tiled_arr_2d = np.tile(arr_2d, (2, 3)) # 行方向に2回、列方向に3回繰り返す
print(tiled_arr_2d)
出力例
[[1 2 1 2 1 2]
[3 4 3 4 3 4]
[1 2 1 2 1 2]
[3 4 3 4 3 4]]
np.tileの応用例
np.tileは、様々なシナリオでその真価を発揮します。
1. 次元数の異なる配列への適用
repsの次元数が元の配列Aの次元数と異なる場合、np.tileは自動的に次元を調整してくれます。
repsの次元数がAより小さい場合
repsの要素がAの次元の先頭から順に適用され、残りの次元は1回繰り返されると解釈されます。
サンプルコード
import numpy as np
arr = np.array([[1, 2], [3, 4]])
tiled_arr = np.tile(arr, 2) # arrを全体的に2回繰り返す
print(tiled_arr)
出力例
[[1 2 1 2]
[3 4 3 4]]
2. ブロードキャストの代替としての利用
ブロードキャストでは対応が難しい複雑な繰り返しパターンも、np.tileを使えば簡単に実現できます。例えば、あるベクトルを複数回、行または列にコピーしたい場合などに便利です。
サンプルコード
import numpy as np
# 行ベクトルを複数行にコピーしたい場合
row_vec = np.array([10, 20, 30])
copied_rows = np.tile(row_vec, (4, 1)) # 4行、1列方向にコピー
print("Copied Rows:\n", copied_rows)
print("-" * 20)
# 列ベクトルを複数列にコピーしたい場合
col_vec = np.array([[100], [200]])
copied_cols = np.tile(col_vec, (1, 3)) # 1行、3列方向にコピー
print("Copied Columns:\n", copied_cols)
出力例
Copied Rows:
[[10 20 30]
[10 20 30]
[10 20 30]
[10 20 30]]
--------------------
Copied Columns:
[[100 100 100]
[200 200 200]]
まとめ
np.tileは、NumPy配列を柔軟に繰り返し並べるための強力な関数です。1次元から多次元配列まで対応し、reps引数を適切に指定することで、様々な繰り返しパターンを効率的に作成できます。データの前処理やシミュレーションなど、NumPyを用いたプログラミングにおいて、この関数は非常に役立つでしょう。ぜひ活用してみてください。

