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 | 入力の配列(リストなど配列に変換できるものでも可) |
axis | None(既定)なら長さ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や転置など、配列の形を変える操作の記事です。




