np.tileの使い方|NumPy配列をタイル状に繰り返す方法とnp.repeat・ブロードキャストとの違い
np.tile(A, reps)は、配列Aを丸ごと1つのタイルとして、repsで指定した回数だけ縦横に敷き詰めた新しい配列を返す関数です。np.tile([1, 2, 3], 2)は[1 2 3 1 2 3]になり、要素ごとに繰り返すnp.repeat([1 1 2 2 3 3])とは並び方が違います。
この記事では、repsに整数とタプルを渡したときの動き、配列の次元とrepsの長さが違うときのルール、np.repeat・ブロードキャストとの使い分けを、実際に動かした出力で説明します。動作確認はNumPy 2.5.4(Python 3.12)で行い、仕様はNumPy公式リファレンス(v2.5)に合わせています(2026年10月15日確認)。
np.tileとは:配列を「タイル」として並べる関数
書式はnumpy.tile(A, reps)で、引数は2つだけです。
| 引数 | 意味 | 例 |
|---|---|---|
A |
繰り返す元の配列(リストやスカラーも可) | np.array([1, 2, 3]) |
reps |
各軸で何回繰り返すか。整数またはタプル | 3、(2, 3) |
戻り値は新しいndarrayで、次元数は「Aの次元数」と「repsの長さ」の大きいほうになります。風呂場のタイルのように、元の配列を1枚のタイルとして縦にreps[0]枚、横にreps[1]枚並べる、とイメージすると覚えやすいです。
基本の使い方
1次元配列を繰り返す
repsに整数を渡すと横方向に連結され、タプル(行, 列)を渡すと2次元に並びます。
import numpy as np
a = np.array([1, 2, 3])
print(np.tile(a, 3))
print(np.tile(a, (2, 3)))
実行結果:
[1 2 3 1 2 3 1 2 3]
[[1 2 3 1 2 3 1 2 3]
[1 2 3 1 2 3 1 2 3]]
1次元の配列に(2, 3)を渡すと、結果は2次元になります。[1, 2, 3]が「1行3列のタイル」とみなされ、それを縦2枚・横3枚に並べた形です。
2次元配列を縦横に繰り返す
import numpy as np
b = np.array([[1, 2],
[3, 4]])
print(np.tile(b, (2, 3)))
print(np.tile(b, (2, 3)).shape)
実行結果:
[[1 2 1 2 1 2]
[3 4 3 4 3 4]
[1 2 1 2 1 2]
[3 4 3 4 3 4]]
(4, 6)
2行2列の配列を縦2枚・横3枚に並べたので、形は(2×2, 2×3) = (4, 6)です。結果の形は「元の形×reps」で計算できます。
repsの長さと配列の次元が違うときのルール
np.tileで一番つまずきやすいのがここです。公式リファレンスには次の2つのルールが書かれています。
- repsが短いとき:repsの先頭に1を補ってAの次元数にそろえる。形が(2, 3, 4, 5)の配列にreps=(2, 2)を渡すと、(1, 1, 2, 2)として扱われる。
- repsが長いとき:Aの形の先頭に長さ1の軸を補ってrepsの長さにそろえる。形(3,)の配列は、2次元なら(1, 3)、3次元なら(1, 1, 3)とみなされる。
つまり、足りないほうに「先頭から」1を補います。後ろの軸から対応していく、と覚えてください。
2次元配列にrepsを整数1つだけ渡す
import numpy as np
b = np.array([[1, 2],
[3, 4]])
print(np.tile(b, 2)) # (1, 2) と同じ = 列方向に2回
print(np.tile(b, (2, 1))) # 行方向に2回
実行結果:
[[1 2 1 2]
[3 4 3 4]]
[[1 2]
[3 4]
[1 2]
[3 4]]
np.tile(b, 2)はrepsが(1, 2)に補われるため、行方向ではなく列方向(最後の軸)に2回並びます。縦に並べたいときは(2, 1)と明示します。「整数を渡すと全部の軸で繰り返される」わけではない点に注意してください。
1次元配列に3要素のrepsを渡す
import numpy as np
a = np.array([1, 2, 3]) # shape (3,)
print(np.tile(a, (2, 1)).shape) # a は (1, 3) とみなされる
print(np.tile(a, (2, 1, 2)).shape)
print(np.tile(a, (2, 1, 2)))
実行結果:
(2, 3)
(2, 1, 6)
[[[1 2 3 1 2 3]]
[[1 2 3 1 2 3]]]
形(3,)の配列に(2, 1, 2)を渡すと、配列は(1, 1, 3)とみなされ、結果は(1×2, 1×1, 3×2) = (2, 1, 6)になります。思った形にならないときは、reshapeなどで先に次元をそろえてからnp.tileを呼ぶのが確実です。公式リファレンスもそのように勧めています。
Pythonのリストの * との違い
Pythonのリストは[1, 2, 3] * 2で連結できますが、NumPy配列で同じように書くと要素ごとの掛け算になります。配列のまま連結したいときにnp.tileを使います。
import numpy as np
lst = [1, 2, 3]
print(lst * 2) # リストの * は連結
print(np.array(lst) * 2) # 配列の * は要素ごとの掛け算
print(np.tile(lst, 2)) # 配列で連結したいなら np.tile
実行結果:
[1, 2, 3, 1, 2, 3]
[2 4 6]
[1 2 3 1 2 3]
np.repeatとの違い
名前が似ているnp.repeatは、配列全体ではなく要素を1つずつ繰り返します。
import numpy as np
a = np.array([1, 2, 3])
print("tile :", np.tile(a, 2))
print("repeat:", np.repeat(a, 2))
b = np.array([[1, 2],
[3, 4]])
print(np.repeat(b, 2, axis=0))
print(np.repeat(b, [1, 3], axis=1))
実行結果:
tile : [1 2 3 1 2 3]
repeat: [1 1 2 2 3 3]
[[1 2]
[1 2]
[3 4]
[3 4]]
[[1 2 2 2]
[3 4 4 4]]
| np.tile | np.repeat | |
|---|---|---|
| 繰り返す単位 | 配列全体 | 要素(またはaxisに沿った行・列) |
| [1, 2, 3]を2回 | [1 2 3 1 2 3] |
[1 1 2 2 3 3] |
| 軸の指定 | repsのタプルで軸ごとに回数を指定 | axis引数で1つの軸を指定 |
| 要素ごとに回数を変える | できない | できる([1, 3]のようにリストで指定) |
| axisを省略したとき | 形を保ったまま並べる | 1次元に平らにしてから繰り返す |
使い分けの例として、「A, B, Cの3項目を2日分」というデータを作るとき、項目の列はnp.tile、日付の列はnp.repeatで作ると行がそろいます。
import numpy as np
labels = np.array(["A", "B", "C"])
days = 2
print(np.tile(labels, days)) # 日ごとに A,B,C を繰り返す
print(np.repeat(["1日目", "2日目"], len(labels)))
実行結果:
['A' 'B' 'C' 'A' 'B' 'C']
['1日目' '1日目' '1日目' '2日目' '2日目' '2日目']
ブロードキャストで済むならnp.tileは使わない
公式リファレンスには「tileはブロードキャストの代わりに使えるが、NumPyのブロードキャスト演算や関数を使うことを強く推奨する」という注記があります。行ベクトルを各行に足したいだけなら、np.tileで同じ形に広げる必要はありません。
import numpy as np
row = np.array([10, 20, 30])
tiled = np.tile(row, (10000, 1))
view = np.broadcast_to(row, (10000, 3))
print(tiled.shape, view.shape)
print("tile のメモリ:", tiled.nbytes, "bytes")
print("broadcast_to の元データ:", view.base.nbytes, "bytes")
print("書き込み可能か:", tiled.flags.writeable, view.flags.writeable)
data = np.arange(6).reshape(2, 3)
print(data + np.tile(row, (2, 1)))
print(data + row) # ブロードキャストなら tile は不要
実行結果:
(10000, 3) (10000, 3)
tile のメモリ: 240000 bytes
broadcast_to の元データ: 24 bytes
書き込み可能か: True False
[[10 21 32]
[13 24 35]]
[[10 21 32]
[13 24 35]]
np.tileは実際にデータをコピーするので、1万行に広げると240,000バイトを使います。np.broadcast_toは元の24バイトを指す読み取り専用のビューを返すだけです。計算に使うだけならブロードキャスト(data + row)かbroadcast_toで十分で、np.tileが必要なのは「繰り返した結果を独立した配列として書き換えたい」「ファイルに保存したい」といった場面です。
使いどころの例:市松模様を作る
パターンの最小単位を作って敷き詰める処理は、np.tileが最も得意とするところです。2×2の単位を4×4枚並べると、8×8の市松模様になります。
import numpy as np
cell = np.array([[0, 1],
[1, 0]])
board = np.tile(cell, (4, 4))
print(board)
実行結果:
[[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]]
画像処理のテスト用のパターン画像や、ボードゲームの盤面の初期化などに使えます。
使いどころの例:画像(3次元配列)を並べる
カラー画像は「高さ×幅×チャンネル(RGB)」の3次元配列です。ここで先ほどのルールが効いてきます。repsを2要素で渡すと後ろの2軸(幅とチャンネル)に対応してしまい、チャンネル数が3倍に増えてしまいます。
import numpy as np
img = np.zeros((2, 2, 3), dtype=np.uint8) # 高さ2・幅2・RGB3チャンネル
img[0, 0] = [255, 0, 0] # 左上だけ赤
wrong = np.tile(img, (2, 3)) # (1, 2, 3) とみなされ、チャンネル軸が3倍になる
right = np.tile(img, (2, 3, 1)) # チャンネル軸は1回
print(wrong.shape)
print(right.shape)
print(right[:, :, 0]) # 赤チャンネルだけ表示
実行結果:
(2, 4, 9)
(4, 6, 3)
[[255 0 255 0 255 0]
[ 0 0 0 0 0 0]
[255 0 255 0 255 0]
[ 0 0 0 0 0 0]]
形(2, 2, 3)の画像に(2, 3)を渡すと、repsが(1, 2, 3)に補われて形は(2, 4, 9)になります。画像を縦2枚・横3枚に並べたいときは、チャンネル軸を1にした(2, 3, 1)を渡します。画像データとNumPy配列の変換はPython Pillowの使い方とNumPy連携で解説しています。
知っておきたい細かい挙動
import numpy as np
a = np.array([1, 2, 3])
t = np.tile(a, 2)
t[0] = 99
print(a, t) # 元の配列は変わらない
print(np.tile(a, 0), np.tile(a, 0).shape)
print(np.tile(5, 3)) # スカラーも渡せる
実行結果:
[1 2 3] [99 2 3 1 2 3]
[] (0,)
[5 5 5]
- 結果はコピー:np.tileの戻り値を書き換えても、元の配列は変わりません。
- reps=0なら空の配列:形が(0,)の空の配列が返ります。
- スカラーやリストも渡せる:Aはarray_like(配列に変換できるもの)なので、
np.tile(5, 3)のようにも書けます。
配列を横や縦に「別々の配列どうしで」つなぎたいときは、np.tileではなく結合用の関数を使います。np.hstack(横方向)やnp.vstack(縦方向)を参照してください。
よくある質問
Q. np.tileは何をする関数ですか?
配列全体を1つのタイルとして、repsで指定した回数だけ縦横に並べた新しい配列を作る関数です。np.tile([1, 2, 3], 2)は[1 2 3 1 2 3]になります。
Q. np.tileとnp.repeatの違いは何ですか?
np.tileは配列全体を繰り返し、np.repeatは要素を1つずつ繰り返します。[1, 2, 3]を2回繰り返すと、np.tileは[1 2 3 1 2 3]、np.repeatは[1 1 2 2 3 3]です。
Q. 2次元配列にnp.tile(b, 2)とすると縦に並ばないのはなぜですか?
repsが配列の次元より短いときは、先頭に1が補われるためです。np.tile(b, 2)はnp.tile(b, (1, 2))と同じで、列方向に並びます。縦に並べたいときは(2, 1)と指定します。
Q. np.tileとブロードキャストはどちらを使えばよいですか?
計算に使うだけならブロードキャストを使います。np.tileはデータを実際にコピーするのでメモリを使います。公式リファレンスもブロードキャストの利用を強く推奨しています。
NumPy|形状の操作の関連記事
reshapeや転置など、配列の形を変える操作の記事です。




