Pythonプログラミングを効率化する:NumPyの`np.zeros`完全活用ガイド
![]()
【Hiroki】
Yukiさん、こんばんは。プログラミングの勉強をしていたら、データ分析やAIのコードで「NumPy」というライブラリがよく出てくることに気づきました。その中でも、特にnp.zerosという関数が頻繁に使われているみたいなんですけど、これって一体何をしているんですか?
![]()
【Yuki】
Hirokiくん、こんばんは。夜遅くまで勉強頑張っているんですね...。夜は静かで集中しやすいですし、わたしもこの時間は落ち着くので好きです。
NumPyのnp.zerosですね。確かに、数値計算や機械学習のコードを書くときには欠かせない、とても大切な関数だと思います。簡単に言うと、「指定したサイズで、中身がすべて0の配列を作る」ための関数なんです。
![]()
【Hiroki】
中身が全部0の配列……。でも、最初から0が入っている配列をわざわざ作って、何に使うんですか? 後からデータを入れ直すなら、最初からそのデータで作ればいいような気がするんですけど。
![]()
【Yuki】
ふふ、そう思うのも無理はありません...。でも、実は「あらかじめ場所を確保しておく」という作業は、プログラミングにおいて効率面でも管理面でもすごく重要なんです。
これから、なぜnp.zerosが必要なのか、どうやって使うのか、ゆっくり解説していきますね。
NumPyの基本とnp.zerosの役割
![]()
【Yuki】
まず、NumPy(ナンパイ)について少しだけおさらいしましょう。Python標準の「リスト」でもデータの集まりは扱えますが、NumPyは「多次元配列(ndarray)」という形式でデータを扱うことで、大量の数値を高速に処理できるライブラリです。
その中でnp.zerosは、特定の形(シェイプ)を持った「空の器」を、とりあえず0で埋めた状態で用意するために使われます。
![]()
【Hiroki】
「空の器」ですか。
![]()
【Yuki】
はい。例えば、100回計算を繰り返して、その結果を一つずつ保存していきたいとします。計算が終わるたびにリストに要素を追加していくよりも、最初から「100個入る箱」を用意しておいて、そこに結果を書き込んでいくほうが、コンピュータにとっては処理がスムーズなんです。
特に、画像データやAIの重み(ウェイト)などを扱うときは、あらかじめデータのサイズが決まっていることが多いので、この「初期化」という作業がよく行われるんですよ。
np.zerosの基本的な使い方と引数
![]()
【Hiroki】
なるほど。サイズが決まっているなら、先に予約しておく方が効率がいいんですね。具体的にはどうやって書くんですか?
![]()
【Yuki】
基本的には、import numpy as npとしてライブラリを読み込んだ後、以下のように記述します。
import numpy as np
# 5つの要素を持つ1次元配列を作成
zeros_array = np.zeros(5)
print(zeros_array)
# 出力: [0. 0. 0. 0. 0.]
![]()
【Hiroki】
あ、本当だ。0が5個並んでいますね。でも、数字の後に「.(ドット)」がついているのはどうしてですか?
![]()
【Yuki】
いいところに気づきましたね...。それは、np.zerosがデフォルト(標準)で浮動小数点数(float64)として配列を作るからです。「0」ではなく「0.0」として扱われている、ということですね。
ここで、np.zerosの主な引数を確認しておきましょう。
- shape: 配列の形を指定します(整数、または整数のタプル)。
- dtype: データの型を指定します(省略すると
float64)。 - order: メモリ上の配置順序を指定します(通常は意識しなくて大丈夫です)。
![]()
【Hiroki】
shapeに一つの数字を入れると1次元の配列になるんですね。じゃあ、2次元の表みたいなものを作りたいときはどうすればいいんですか?
多次元配列(行列)の生成
![]()
【Yuki】
2次元以上の配列を作るときは、shapeをタプル(丸括弧で囲んだ形)で指定してあげます。ここが初心者の人が一番間違いやすいポイントかもしれません...。
# 3行5列の2次元配列を作成
# 引数を (行数, 列数) というタプルで渡すのがポイントです
zeros_matrix = np.zeros((3, 5))
print(zeros_matrix)
![]()
【Hiroki】
あ、np.zeros(3, 5)ではなくて、np.zeros((3, 5))と、括弧が二重になるんですね。
![]()
【Yuki】
そうです。np.zerosという関数に渡す「一つの引数(shape)」が、たまたま「(3, 5)」というタプルである、というイメージですね。
ちなみに、3次元以上の配列も同じように作れます。
# 2x3x4 の3次元配列
zeros_3d = np.zeros((2, 3, 4))
![]()
【Hiroki】
次元が増えても同じルールでいけるのは分かりやすいです。でも、やっぱり全部「0.」になっちゃうんですね。整数で扱いたいときはどうすればいいんでしょう?
データ型(dtype)の指定とその重要性
![]()
【Yuki】
整数の0を使いたいときは、2番目の引数であるdtypeを指定します。
# 整数(int)型の0で埋める
zeros_int = np.zeros((2, 2), dtype=int)
print(zeros_int)
# 出力:
# [[0 0]
# [0 0]]
![]()
【Hiroki】
あ、今度はドットが消えて、ちゃんとした整数になりました!
![]()
【Yuki】
はい。実はこのdtypeの指定は、メモリの節約や計算精度の管理においてすごく大切なんです。
例えば、画像処理では各ピクセルの値を 0〜255 の整数(uint8)で扱うことが多いですし、最新のAIモデルの計算では、処理を高速化するために精度を少し落とした浮動小数点数(float16やbfloat16)を使うこともあります。
最近話題のAI、例えばGoogleのGemini(ジェミニ)のような高度なモデルでも、内部的にはこうした数値の型を厳密に管理することで、膨大な計算を効率化しているんですよ。最新の google-genai ライブラリなどを使ってAPIを叩く際も、受け取ったデータをNumPy配列として処理する場面が出てくるかもしれませんね。
![]()
【Hiroki】
へぇ、こんな単純な「0」の集まりでも、AIみたいな最先端の技術に繋がっているんですね。
np.zerosと他の初期化関数の違い(ones, empty, full)
![]()
【Hiroki】
np.zerosの使い方はわかりました。でも、他にも似たような関数ってあるんですか? 0以外で埋めたいときとか。
![]()
【Yuki】
ええ、いくつかありますよ。よく使うものを比較してみましょうか。
np.ones: すべてを「1」で埋めます。np.full: 指定した「任意の値」で埋めます。np.empty: 中身を初期化せず、メモリ領域だけを確保します。
![]()
【Hiroki】
np.empty? 中身を初期化しないってどういうことですか?
![]()
【Yuki】
np.zerosは、メモリを確保した後にその領域を0で塗りつぶす作業をします。でもnp.emptyは、その塗りつぶし作業をスキップして、そのときメモリに残っていた「ゴミデータ」がそのまま入った状態で配列を返します。
# 2x2の空の配列(中身は何が出るか分かりません)
empty_array = np.empty((2, 2))
![]()
【Hiroki】
えっ、ゴミデータが入っているなら、危なくて使えないんじゃないですか?
![]()
【Yuki】
そうですね...初心者の方は基本的にはnp.zerosを使うのが安全だと思います。
ただ、すぐに別の計算結果で中身を上書きすることが決まっている場合、0で埋める手間さえも省きたいという超高速化の場面で使われることがあるんです。でも、予期せぬ数値が入ってしまうリスクがあるので、わたしはあまりお勧めしません...。まずはnp.zerosで確実に初期化するのがいいと思います。
![]()
【Hiroki】
なるほど。安全第一ならnp.zerosですね。
実践的な活用シーン:機械学習と画像処理の準備
![]()
【Yuki】
では、もう少し具体的な使い道を想像してみましょうか。
例えば、画像処理。画像は「高さ × 幅 × 色の3チャンネル(RGB)」という3次元配列として扱われます。 真っ黒な画像(すべてのピクセルが0)を新しく作りたいときは、次のように書きます。
# 縦100px、横200px、3チャンネル(カラー)の真っ黒な画像データを作成
black_image = np.zeros((100, 200, 3), dtype=np.uint8)
また、機械学習の文脈では、モデルの学習を始める前に、重み(パラメータ)を一旦0で初期化して、そこから少しずつ学習を進めていく、という手法でも使われることがあります。
![]()
【Hiroki】
確かに、何かを積み上げていくベース(土台)として「0」が必要になるんですね。
![]()
【Yuki】
その通りです。また、データの「パディング」といって、データのサイズを揃えるために周りに0を付け足す処理などでも活躍します。
地味な関数かもしれませんが、デジタルな世界で「何もない空間」を定義するために、これほど便利なものはないかもしれません...。
まとめと次のステップ
![]()
【Hiroki】
Yukiさん、ありがとうございます! np.zerosが単に0を並べるだけじゃなくて、プログラムを効率的に動かすための「予約席」みたいな役割を持っていることがよくわかりました。
![]()
【Yuki】
それは良かったです。最後に、今回のポイントをまとめておきますね。
np.zerosは、指定した形の0埋め配列を作る。- 形(shape)を指定するとき、多次元ならタプル
(rows, cols)で渡す。 - デフォルトは浮動小数点数(float64)なので、整数にしたいときは
dtype=intを指定する。 - 効率的なデータ保存や、画像・AIモデルの初期化によく使われる。
NumPyには他にもたくさんの便利な関数があります。公式ドキュメントも、英語が中心ですがコード例が豊富で参考になりますよ。
![]()
【Hiroki】
公式ドキュメントも少しずつ覗いてみるようにします。まずは自分で色んなサイズの配列を作って遊んでみますね。
![]()
【Yuki】
ええ、ぜひ試してみてください。実際に手を動かして、配列の形が変わるのを見るのが一番の近道だと思います...。
あ、もうこんな時間ですね。夜更かししすぎると、明日の朝が辛くなってしまいますよ...。わたしも朝は少し苦手なので、そろそろ作業を切り上げて休もうと思います。
また分からないことがあったら、いつでも聞いてくださいね。Hirokiくんの学習を、わたしなりに精一杯サポートさせていただきます。
![]()
【Hiroki】
はい! Yukiさん、ありがとうございました。おやすみなさい!
![]()
【Yuki】
おやすみなさい。良い夢を...。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


