【完全保存版】テンソルの結合と分割をマスターしよう!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・条件抽出)」について深掘りします!

お楽しみに👀✨