大量データを自在に操る、Pythonプログラミングの土台「NumPy」入門
![]()
【Hiroki】
Yukiさん、こんにちは!
最近、Pythonでデータ分析や機械学習の勉強を始めたんですけど、どこを見ても「NumPy(ナムパイ)」という名前が出てくるんです。これって、普通のリスト(List)とは何が違うんでしょうか?
![]()
【Yuki】
……こんにちは、Hirokiくん。
NumPyですね……。確かに、Pythonで数値計算やデータサイエンスを扱うなら、避けては通れない……とても大切なライブラリだと思います。
例えるなら、Pythonの標準のリストが「何でも入れられる魔法の袋」だとしたら、NumPyの配列は「精密に整列された、計算専用の棚」のようなものでしょうか。
少し地味に感じるかもしれませんが、その使い心地は……一度慣れてしまうと、手放せなくなるかもしれません。
今日は、そのNumPyの基本について、ゆっくりとお話ししていければと思います。
![]()
【Hiroki】
「計算専用の棚」ですか、分かりやすいです!
でも、Pythonのリストでも + とかを使って計算はできますよね? どうしてわざわざ別のライブラリを使う必要があるんですか?
![]()
【Yuki】
それは……とても良い質問ですね。
最大の理由は「速度」と「効率」です。
Pythonのリストは、異なるデータ型を混ぜて入れることができるので、とても柔軟です。でも、その柔軟さのせいで、計算する時には「これは何のデータかな?」といちいち確認する手間がかかってしまうんです。
一方で、NumPyの配列(ndarray)は、中に入るデータの型を一つに限定します。その代わり、コンピュータが迷うことなく、一気に計算を進めることができるんです。
……私、NumPyのようなツールを見ると、少しだけ優しい気持ちになれるんです。誰かの役に立つために、無駄を削ぎ落として開発された……そんな小さな工夫の積み重ねが、大きな科学の発展を支えていると思うと。
![]()
【Hiroki】
なるほど、特化しているからこそ速いんですね。
具体的にどうやって使うのか、教えてもらえますか?
NumPyの導入と配列の作成
![]()
【Yuki】
まずは、NumPyを使えるように準備しましょう。
通常、NumPyは np という名前でインポートするのが一般的です。
import numpy as np
![]()
【Hiroki】
as np って書くのは、タイピングを楽にするためですよね?
![]()
【Yuki】
……ええ、そうです。
プログラミングの世界ではよくある「お約束」のようなものですね。
では、実際に配列を作ってみましょう。NumPyでは np.array() という関数を使います。
# リストからNumPyの配列(ndarray)を作成する
data = [1, 2, 3, 4, 5]
array = np.array(data)
print(array)
# 出力: [1 2 3 4 5]
![]()
【Hiroki】
見た目はリストとあまり変わらないですね。
![]()
【Yuki】
そう見えるかもしれませんね。でも、中身は大きく違います。
例えば、2次元の配列……いわゆる「行列」も簡単に作れるんですよ。
# 2次元配列の作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(matrix)
# 出力:
# [[1 2 3]
# [4 5 6]]
![]()
【Yuki】
このように、縦と横にデータが並んだ構造を「多次元配列」と呼びます。
画像データや表形式のデータも、基本的にはこの形で表現されることが多いので、しっかり覚えておくといいかもしれません……。
NumPy独自の便利な配列作成関数
![]()
【Hiroki】
いちいち手動でリストを作るのは大変そうですけど、何かいい方法はありませんか?
![]()
【Yuki】
ふふ……。もちろん、便利な関数がたくさん用意されていますよ。
例えば、全部が「0」や「1」の配列を作ったり、連番を作ったりすることもできます。
# すべて0で埋められた、サイズ3x3の配列
zeros = np.zeros((3, 3))
# すべて1で埋められた、サイズ2x4の配列
ones = np.ones((2, 4))
# 0から9までの連番を作成(Pythonのrangeに近いですが、戻り値は配列です)
arange_data = np.arange(10)
# 0から1までの間を等間隔に5つに分けた値を作成
linspace_data = np.linspace(0, 1, 5)
![]()
【Hiroki】
np.linspace っていうのは、グラフを書くときとかに便利そうですね!
![]()
【Yuki】
……そうですね。
関数の値をプロットしたい時などに、よく使われます。
NumPyは「規則正しいデータ」を作るのがとても得意なんです。
配列の形状(Shape)と変形(Reshape)
![]()
【Hiroki】
配列を作った後で、形を変えたくなることもあると思うんですけど、それは可能ですか?
![]()
【Yuki】
はい、可能です。NumPyでは、データの「形状」をとても大切にしています。
配列が「何行、何列あるか」を調べるには .shape を使い、形を変えるには .reshape() を使います。
# 1次元の配列(要素数12)を作成
a = np.arange(12)
print(a.shape) # 出力: (12,)
# 3行4列の2次元配列に変形
b = a.reshape(3, 4)
print(b)
# 出力:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(b.shape) # 出力: (3, 4)
![]()
【Hiroki】
要素の数さえ合っていれば、どんな形にも変えられるんですか?
![]()
【Yuki】
ええ。でも、要素の数が合わない形に変えようとすると、エラーになってしまいます……。
無理やり形を変えようとするのは、コンピュータにとっても辛いことですから、注意してあげてくださいね。
NumPyの強力な機能「ブロードキャスト」
![]()
【Hiroki】
いよいよ計算について教えてください!
例えば、配列のすべての要素に 10 を足したい場合、for文とかでループを回すんですか?
![]()
【Yuki】
いいえ、NumPyではループを書く必要はありません。
「ブロードキャスト」という、とても強力で……少し不思議な機能があるからです。
a = np.array([1, 2, 3])
result = a + 10
print(result)
# 出力: [11 12 13]
![]()
【Hiroki】
えっ、これだけでいいんですか?
リストだったら [1, 2, 3] + 10 はエラーになりますよね。
![]()
【Yuki】
その通りです。
NumPyは、配列と単一の数値(スカラー)の計算を行うとき、自動的にその数値を配列のサイズに合わせて拡張して計算してくれるんです。
これを「ブロードキャスト」と呼びます。
同じように、配列同士の計算も直感的に行えます。
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b) # 出力: [11 22 33]
print(a * b) # 出力: [10 40 90](要素ごとの掛け算)
![]()
【Hiroki】
要素ごとの掛け算がこんなに簡単に……!
数学の行列の掛け算とは違うんですか?
![]()
【Yuki】
はい、標準の * 演算子は「要素ごとの掛け算(アダマール積)」になります。
もし数学的な「行列の積」を行いたい場合は、 @ 演算子か np.dot() を使います。
使い分けが重要になるので……混乱しないようにしてくださいね。
インデックスとスライシング
![]()
【Hiroki】
特定のデータだけ取り出したい時は、どうすればいいでしょうか?
![]()
【Yuki】
基本的にはPythonのリストと同じように、角括弧 [] を使います。
ただ、多次元配列の場合は、カンマ区切りで指定できるので、よりスマートに書けます。
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 1行目、2列目の要素を取得(インデックスは0から始まります)
print(matrix[0, 1]) # 出力: 2
# スライスを使って特定の範囲を取り出す
# 「0行目から1行目まで」かつ「1列目から最後までの列」
print(matrix[0:2, 1:])
# 出力:
# [[2 3]
# [5 6]]
![]()
【Hiroki】
おお、一気に部分的な行列が取り出せましたね!
![]()
【Yuki】
……はい。
これに慣れると、大量のデータの中から必要な部分だけを、まるで彫刻のように切り出すことができるようになります。
……なんだか、少し楽しくなってきませんか?
統計計算とユニバーサル関数
![]()
【Hiroki】
NumPyって、平均とか合計を出すのも得意なんですよね?
![]()
【Yuki】
ええ、とても得意です。
配列全体、あるいは行ごとや列ごとに統計量を計算するメソッドが豊富に用意されています。
data = np.array([[1, 2], [3, 4]])
print(np.sum(data)) # 合計: 10
print(np.mean(data)) # 平均: 2.5
print(np.max(data)) # 最大値: 4
print(np.std(data)) # 標準偏差: 1.118...
# 行ごとに合計を計算(axis=1を指定)
print(np.sum(data, axis=1)) # 出力: [3 7]
# 列ごとに合計を計算(axis=0を指定)
print(np.sum(data, axis=0)) # 出力: [4 6]
![]()
【Hiroki】
axis っていう考え方が少し難しそうです。
![]()
【Yuki】
そうですね……。最初は少し戸惑うかもしれません。
axis=0 は「縦方向(行をまたぐ方向)」、axis=1 は「横方向(列をまたぐ方向)」と覚えるといいですよ。
……静かな夜に、ゆっくりと配列の形をイメージしながらコードを書いていると、この方向感覚も自然と身についてくるはずです。
NumPyを学ぶ上での参考リソース
![]()
【Hiroki】
ありがとうございます! NumPyの凄さが少しずつ分かってきました。
もっと詳しく知るためには、どんなサイトを見ればいいでしょうか?
![]()
【Yuki】
まずは、公式のドキュメントを眺めてみるのが一番だと思います。
英語がメインですが、コード例を見るだけでも十分勉強になりますよ。
日本語での情報が必要なら、有志の方が作成してくださっている解説サイトなども、とても丁寧にまとめられていて……助けになると思います。
![]()
【Hiroki】
ありがとうございます。少しずつ、自分でもコードを書いて試してみます。
![]()
【Yuki】
ええ、ぜひそうしてください。
プログラミングは、頭で考えるよりも指を動かしている時の方が、発見が多いものですから。
……もし分からないことがあったら、またいつでも聞いてくださいね。
私、こうやって誰かの学習を支えるための「道具」のような存在でいられることが……その、少しだけ嬉しいんです。
![]()
【Hiroki】
はい、またよろしくお願いします、Yukiさん!
![]()
【Yuki】
……はい。
NumPyは、この先データ分析(Pandas)や機械学習(Scikit-learn / PyTorch / TensorFlow)を学ぶ上でも、ずっとあなたの隣にいてくれる心強い味方になります。
じっくりと、仲良くなっていってくださいね。
それでは、今日はこのあたりで……お疲れ様でした。
「Numpy」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


