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や転置など、配列の形を変える操作の記事です。

NumPy全体の使い方は「NumPyの使い方」、「NumPy関数一覧」でまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら