【完全保存版】テンソルの結合と分割をマスターしよう!concatenate・stack・split・chunkの使い方📎🔍
深層学習やデータ前処理では、複数のテンソルをまとめたり、逆に分けたりする操作が頻繁に登場します。
この記事では、テンソル操作の中でも重要な以下の4つの関数について、用途・違い・使い方をわかりやすく解説します👇
-
concatenate
-
stack
-
split
-
chunk
📌 NumPyとPyTorchの両方に対応したコード例も紹介していきます!
🧩 concatenate:既存の次元でくっつける!
import numpy as np
a = np.array([[1, 2], [3, 4]]) # shape: (2, 2)
b = np.array([[5, 6], [7, 8]]) # shape: (2, 2)
c = np.concatenate((a, b), axis=0) # shape: (4, 2)
出力:
[[1 2]
[3 4]
[5 6]
[7 8]]
📌 特徴:
-
既存の軸に沿ってテンソルを結合
-
結合する軸以外のサイズは揃っている必要がある
🧱 stack:新しい次元を追加して積み重ねる!
d = np.stack((a, b), axis=0) # shape: (2, 2, 2)
出力:
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
📌 特徴:
-
新しい次元を追加してテンソルを結合
-
axis=0
なら「上に積む」、axis=1
なら「横に並べる」ようなイメージ
📎 stack
は「次元を増やす結合」、concatenate
は「既存の次元での結合」という違いがあります!
🧪 PyTorch版(同様の操作)
import torch
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
# concatenate
c = torch.cat((a, b), dim=0) # shape: (4, 2)
# stack
d = torch.stack((a, b), dim=0) # shape: (2, 2, 2)
✂️ split:指定サイズごとに分割
x = np.array([1, 2, 3, 4, 5, 6])
parts = np.split(x, 3) # 3つに分割(各サイズ2)
出力:
[array([1, 2]), array([3, 4]), array([5, 6])]
📌 特徴:
-
サイズを指定して分割
-
うまく割り切れないとエラーになるので注意!
NumPy:
np.split(x, [2, 4]) # → [0:2], [2:4], [4:] に分割
PyTorch:
x = torch.tensor([1, 2, 3, 4, 5, 6])
torch.split(x, 2) # → 2個ずつ分割
🔪 chunk:指定個数に等分割(サイズ自動計算)
x = torch.tensor([1, 2, 3, 4, 5, 6])
chunks = torch.chunk(x, 3) # → 3個に分ける(各2要素)
出力:
(tensor([1, 2]), tensor([3, 4]), tensor([5, 6]))
📌 特徴:
-
個数で指定し、各chunkのサイズは自動で割り振られる
-
NumPyには
chunk
はない(代替はarray_split
)
🔄 使い分け早見表
操作 | 目的 | 次元変更 | 代表関数 |
---|---|---|---|
concatenate | 既存軸に結合 | 変わらない | concatenate , torch.cat |
stack | 新しい軸を追加して結合 | 増える | stack , torch.stack |
split | 指定サイズで分割 | 減る | split , torch.split |
chunk | 指定個数で均等分割 | 減る | chunk (PyTorch専用) |
✅ まとめ
-
結合には
concatenate
(同次元)とstack
(新次元追加)がある -
分割には
split
(サイズ指定)とchunk
(個数指定)がある -
データの前処理・バッチ化・モデルの出力整形などで必須の技術!
テンソル操作を自在に操れるようになると、モデル構築もグッとスムーズになりますよ💪📊
次回は「テンソルのインデックス操作とマスキング(boolean indexing・条件抽出)」について深掘りします!
お楽しみに👀✨