np.squeeze()の使い方|NumPy配列からサイズ1の次元を削除する方法とaxisの指定

np.squeeze() は、NumPy配列から長さ(サイズ)が1の次元を取り除く関数です。形状 (1, 3, 1) の配列なら (3,) になり、axis を指定すれば消す次元を選べます。

この記事は NumPy 公式リファレンスの numpy.squeeze に沿って説明し、コードはすべて Python 3.13.16 と NumPy 2.5.4(2026年10月15日確認時点の最新版)で実行した結果を載せています。

np.squeeze()の書き方と引数

numpy.squeeze(a, axis=None)
引数・戻り値内容
a入力の配列(リストなど配列に変換できるものでも可)
axisNone(既定)なら長さ1の次元をすべて削除。整数かタプルで、消す次元を選べる
戻り値長さ1の次元を除いた配列。公式リファレンスでは「常に a 自身か a のビュー」と説明されている
例外axis で指定した次元の長さが1でないと ValueError

配列のメソッドとして arr.squeeze() と書いても同じ動きです(ndarray.squeeze)。

基本の使い方:長さ1の次元をすべて消す

import numpy as np

x = np.array([[[0], [1], [2]]])
print(x.shape)

y = np.squeeze(x)
print(y.shape)
print(y)

実行結果:

(1, 3, 1)
(3,)
[0 1 2]

形状 (1, 3, 1) のうち、長さ1の0番目と2番目の次元が消えて (3,) になりました。長さ1でない次元はそのまま残ります。長さ1の次元がない配列に使っても何も変わりません。

import numpy as np

for shape in [(1, 3), (3, 1), (1, 1, 1, 4), (2, 2)]:
    a = np.zeros(shape)
    print(shape, "→", np.squeeze(a).shape)

実行結果:

(1, 3) → (3,)
(3, 1) → (3,)
(1, 1, 1, 4) → (4,)
(2, 2) → (2, 2)

axisで消す次元を指定する

既定ではすべての長さ1の次元が消えます。一部だけ消したいときは axis に番号を渡します。複数ならタプルです。

import numpy as np

x = np.zeros((1, 3, 1))
print(np.squeeze(x, axis=0).shape)
print(np.squeeze(x, axis=2).shape)
print(np.squeeze(x, axis=(0, 2)).shape)
print(np.squeeze(x, axis=-1).shape)   # 負の番号は後ろから数える

実行結果:

(3, 1)
(1, 3)
(3,)
(1, 3)

長さが1でない次元を指定すると ValueError になります。

import numpy as np

x = np.zeros((1, 3, 1))
try:
    np.squeeze(x, axis=1)
except ValueError as e:
    print("ValueError:", e)

実行結果:

ValueError: cannot select an axis to squeeze out which has size not equal to one

「この次元は必ず1のはず」という前提をコードに書いておきたいときは、あえて axis を指定するのがおすすめです。想定外の形の配列が来たときに、黙って別の形になるのではなくエラーで気づけます。

注意点1:全部消えると0次元配列になる

要素が1つだけの配列をsqueezeすると、すべての次元が消えて形状 () の0次元配列になります。公式リファレンスにも「スカラーではなく0次元配列になる」と書かれています。Pythonの数値として取り出すには .item() を使います。

import numpy as np

x = np.array([[1234]])
y = np.squeeze(x)
print(repr(y), y.shape, y.ndim)
print(y.item(), type(y.item()))

実行結果:

array(1234) () 0
1234 <class 'int'>

バッチサイズが1のときだけ形が変わってしまう、という不具合もよくあります。たとえば (バッチ数, 1) の予測結果を np.squeeze() すると、バッチ数が1のときだけ0次元になります。こうした場面では axis=1 のように消す次元を指定しておくと、バッチ数に関係なく (バッチ数,) の形になります。

import numpy as np

for batch in [3, 1]:
    pred = np.zeros((batch, 1))
    print(batch, np.squeeze(pred).shape, np.squeeze(pred, axis=1).shape)

実行結果:

3 (3,) (3,)
1 () (1,)

注意点2:戻り値は元の配列のビュー

squeezeの結果はデータをコピーせず、元の配列と同じメモリを見ています(ビュー)。そのため結果の値を書き換えると、元の配列も変わります。

import numpy as np

a = np.array([[1, 2, 3]])
b = np.squeeze(a)
b[0] = 100
print(a)
print(np.shares_memory(a, b))

実行結果:

[[100   2   3]]
True

元の配列を残したまま書き換えたいときは np.squeeze(a).copy() のようにコピーを取ります。

よく使う場面

モデルの出力からバッチ次元を外す

機械学習のモデルは、1件だけ予測するときでも先頭にバッチの次元が付いた (1, クラス数) の形で結果を返すことがよくあります。1件分の結果として扱いたいときにsqueezeします。

import numpy as np

out = np.array([[0.1, 0.7, 0.2]])   # (1, 3)
probs = np.squeeze(out, axis=0)
print(probs.shape, probs.argmax())

実行結果:

(3,) 1

縦長の列ベクトルを1次元にする

(n, 1) の列ベクトルを、グラフ描画や集計で扱いやすい (n,) の1次元配列にします。

import numpy as np

col = np.arange(5).reshape(5, 1)
print(col.shape, "→", col.squeeze().shape)
print(col.squeeze())

実行結果:

(5, 1) → (5,)
[0 1 2 3 4]

1枚だけの画像やチャンネル1の画像

グレースケール画像が (高さ, 幅, 1) や (1, 高さ, 幅) の形で読み込まれたとき、squeezeで (高さ, 幅) にすると、2次元配列を受け取る処理にそのまま渡せます。

import numpy as np

img = np.zeros((28, 28, 1))
print(np.squeeze(img, axis=-1).shape)

実行結果:

(28, 28)

reshape・ravel・flatten・expand_dimsとの違い

関数・メソッド何をするか(1, 3, 1) に使った結果
np.squeeze(a)長さ1の次元だけを消す(3,)
a.reshape(...)要素数が同じなら任意の形に変える指定した形
np.ravel(a) / a.ravel()1次元に平らにする(できればビュー)(3,)
a.flatten()1次元に平らにする(常にコピー)(3,)
np.expand_dims(a, axis)長さ1の次元を追加する(squeezeの逆)次元が1つ増える

(1, 3, 1) ではravelもsqueezeも同じ (3,) になりますが、(1, 2, 3) のように長さ1でない次元が2つ以上あると結果が変わります。squeezeは長さ1の次元を消すだけなので形 (2, 3) が残り、ravelは全部つないで (6,) にします。

import numpy as np

a = np.zeros((1, 2, 3))
print("squeeze:", np.squeeze(a).shape)
print("ravel  :", np.ravel(a).shape)
print("reshape:", a.reshape(2, 3).shape)

実行結果:

squeeze: (2, 3)
ravel  : (6,)
reshape: (2, 3)

なお flatten は配列のメソッドとしてだけ存在し、np.flatten() という関数はありません。

import numpy as np
print(hasattr(np, "flatten"), hasattr(np.ndarray, "flatten"))

実行結果:

False True

反対に次元を足したいときは np.expand_dims() か、a[np.newaxis, :] のように np.newaxis(None と同じ)を使います。

import numpy as np

v = np.array([1, 2, 3])
print(np.expand_dims(v, axis=0).shape)
print(v[np.newaxis, :].shape, v[:, None].shape)
print(np.squeeze(np.expand_dims(v, axis=0)).shape)

実行結果:

(1, 3)
(1, 3) (3, 1)
(3,)

pandasのsqueeze()との違い

「python squeeze」で調べると、pandasの DataFrame.squeeze() も見つかります。こちらは1列だけ(または1行だけ)のDataFrameをSeriesに、要素が1つだけならスカラーに変換するメソッドです。考え方は同じですが、戻り値の型が変わる点がNumPyと違います。

import pandas as pd

df = pd.DataFrame({"x": [1, 2, 3]})
print(type(df.squeeze()).__name__)
print(pd.DataFrame({"x": [5]}).squeeze())

実行結果:

Series
5

実行環境は pandas 3.0.6 です。

よくある質問

Q. np.squeeze()は何をする関数ですか?

NumPy配列から長さ(サイズ)が1の次元を取り除く関数です。形状(1, 3, 1)の配列は(3,)になります。長さ1でない次元は変わりません。

Q. 特定の次元だけを消すにはどうしますか?

axis引数に次元の番号を指定します。複数ならaxis=(0, 2)のようにタプルで渡します。指定した次元の長さが1でないとValueErrorになります。

Q. squeezeしたらスカラーではなくarray(5)のような値になりました。

要素が1つだけの配列をsqueezeすると、すべての次元が消えて0次元配列になります。Pythonの数値として取り出したいときは.item()を使ってください。

Q. np.squeeze()とarr.squeeze()は違いますか?

同じ動きです。ndarray.squeezeは公式リファレンスでもnumpy.squeezeと同等と説明されています。書きやすいほうを使って構いません。

Q. squeezeの逆に次元を追加するには?

np.expand_dims(a, axis=0)を使うか、a[np.newaxis, :]のようにnp.newaxisで次元を挿入します。

まとめ

np.squeeze() は長さ1の次元を消すだけの関数ですが、要素が1つのときに0次元配列になることと、結果が元の配列のビューであることは覚えておきましょう。入力の形が変わりうる処理では、axis を明示しておくと思わぬ形の変化を防げます。

NumPy|形状の操作の関連記事

reshapeや転置など、配列の形を変える操作の記事です。

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

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

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