フリーキーズ | 独学プログラミング

NumPy入門!配列操作と高速計算の基礎をやさしく解説

リンドくん

リンドくん

たなべ先生、データサイエンスを勉強するには「NumPy」が必要って聞いたんですけど、これって何ですか?

たなべ

たなべ

NumPyはPythonで数値計算を高速に行うためのライブラリなんだ。
大量のデータを扱うとき、普通のPythonリストより圧倒的に速いんだよ。

データサイエンスやAI開発を学ぶ上で、NumPy(ナムパイ)は避けて通れないライブラリです。
機械学習の有名なライブラリであるPandasやscikit-learn、TensorFlowなども、すべてNumPyを基盤として作られています。

しかし、初めて触れる方にとって「なぜ必要なのか」「どう使うのか」は分かりにくいかもしれません。

この記事では、プログラミング初心者の方でも理解できるよう、NumPyの基礎をシンプルに解説します。
実際のコード例を見ながら、配列の作成から基本操作、高速計算の仕組みまで学んでいきましょう。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

NumPyとは?普通のリストとの違い

リンドくん

リンドくん

NumPyって、普通のPythonリストと何が違うんですか?

たなべ

たなべ

一番の違いは速さなんだ。
100万個のデータを処理する場合、NumPyは普通のリストより10倍以上速いこともあるよ!

NumPyの特徴

NumPyは「Numerical Python」の略で、数値計算を効率的に行うためのライブラリです。

普通のPythonリストとの主な違いは以下の通りです。

  • 処理速度が速い → 大量のデータを素早く計算できる
  • メモリ効率が良い → 同じデータ型だけを格納するため無駄がない
  • 簡潔に書ける → ループを書かずに配列全体を一度に処理できる
  • 豊富な数学関数 → 平均、標準偏差、三角関数などが最初から用意されている

なぜデータサイエンスで使われるのか

データサイエンスでは、数十万、数百万といった大量のデータを扱います。例えば、1枚の画像データだけでも数百万のピクセル情報があります。

このような大量データを普通のPythonリストで処理すると、以下の問題が起きます。

  • 処理に時間がかかりすぎる
  • メモリをたくさん使ってしまう
  • コードが長く複雑になる

NumPyを使えば、これらの問題を解決できるのです。実際、データサイエンス分野のほぼすべてのライブラリがNumPyを基盤にしているほど重要なツールです。

NumPyのインストールと配列の作り方

リンドくん

リンドくん

NumPyを使うには、まず何をすればいいですか?

たなべ

たなべ

インストールはたった1行でできるよ!とても簡単だから安心してね。

インストール方法

pip install numpy

インストール後、Pythonコードで以下のようにインポートします。

import numpy as np

世界中の開発者がnpという短い名前でインポートしているので、この書き方を覚えておきましょう。

配列を作ってみよう

リストから配列を作る

import numpy as np

# 1次元配列
array_1d = np.array([1, 2, 3, 4, 5])
print(array_1d)
# 出力: [1 2 3 4 5]

# 2次元配列
array_2d = np.array([[1, 2, 3], 
                     [4, 5, 6]])
print(array_2d)
# 出力:
# [[1 2 3]
#  [4 5 6]]

便利な配列の作り方

# すべて0の配列
zeros = np.zeros((3, 4))  # 3行4列
print(zeros)

# すべて1の配列
ones = np.ones((2, 3))  # 2行3列
print(ones)

# 連続した数値
numbers = np.arange(0, 10, 2)  # 0から10まで2刻み
print(numbers)
# 出力: [0 2 4 6 8]

# ランダムな数値
random = np.random.rand(3, 3)  # 3×3のランダム配列
print(random)

これらの関数を使えば、様々なパターンの配列を簡単に作れます。機械学習では初期化やテストデータ作成でよく使います。

配列の基本操作

リンドくん

リンドくん

配列を作ったら、次は何ができるんですか?

たなべ

たなべ

配列の情報を確認したり、形を変えたり、特定の要素を取り出したりできるよ。これらは実際の開発でとてもよく使うんだ。

配列の情報を見てみよう

import numpy as np

array = np.array([[1, 2, 3, 4],
                  [5, 6, 7, 8],
                  [9, 10, 11, 12]])

# 形を確認
print(f"形: {array.shape}")  # (3, 4) → 3行4列

# 要素の個数
print(f"要素数: {array.size}")  # 12個

# データ型
print(f"データ型: {array.dtype}")  # int64

配列の形を変える

# 1次元配列を作成
original = np.arange(12)
print(original)
# 出力: [ 0  1  2  3  4  5  6  7  8  9 10 11]

# 3行4列に変形
reshaped = original.reshape(3, 4)
print(reshaped)
# 出力:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

配列から要素を取り出す

array = np.array([[1, 2, 3, 4],
                  [5, 6, 7, 8],
                  [9, 10, 11, 12]])

# 特定の要素
print(array[0, 0])  # 1行1列目 → 1
print(array[1, 2])  # 2行3列目 → 7

# 行全体
print(array[0])  # 1行目 → [1 2 3 4]

# 列全体
print(array[:, 1])  # 2列目 → [ 2  6 10]

Pythonのリストと似ていますが、2次元配列でも直感的にアクセスできるのがNumPyの便利なところです。

NumPyの高速計算

リンドくん

リンドくん

NumPyが速いって聞きましたけど、実際どう使うんですか?

たなべ

たなべ

NumPyの最大の特徴は、ループを書かずに配列全体を一度に処理できることなんだ。これを見てみよう!

配列全体への計算

import numpy as np

array = np.array([1, 2, 3, 4, 5])

# すべての要素を2倍に
doubled = array * 2
print(doubled)
# 出力: [ 2  4  6  8 10]

# すべての要素に10を足す
added = array + 10
print(added)
# 出力: [11 12 13 14 15]

# すべての要素を2乗
squared = array ** 2
print(squared)
# 出力: [ 1  4  9 16 25]

普通のPythonリストなら、ループやリスト内包表記を書く必要があります。NumPyならこんなにシンプルです!

配列同士の計算

array1 = np.array([1, 2, 3, 4])
array2 = np.array([10, 20, 30, 40])

# 足し算
print(array1 + array2)
# 出力: [11 22 33 44]

# 掛け算(要素ごと)
print(array1 * array2)
# 出力: [ 10  40  90 160]

便利な数学関数

array = np.array([1, 4, 9, 16, 25])

# 平方根
print(np.sqrt(array))
# 出力: [1. 2. 3. 4. 5.]

# 平均値
print(np.mean(array))
# 出力: 11.0

# 合計
print(np.sum(array))
# 出力: 55

# 最大値・最小値
print(np.max(array))  # 25
print(np.min(array))  # 1

これらの関数は、データ分析や機械学習で頻繁に使います。

データの統計処理

リンドくん

リンドくん

テストの点数とか、データを分析するときにはどう使えばいいですか?

たなべ

たなべ

いい質問だね!実際の成績データを例に見てみよう。

成績データの分析例

import numpy as np

# 学生5人、科目3つの成績データ
scores = np.array([
    [85, 90, 78],  # 学生1
    [92, 88, 95],  # 学生2
    [76, 85, 80],  # 学生3
    [88, 92, 87],  # 学生4
    [95, 89, 93]   # 学生5
])

# 各学生の平均点(行方向に計算)
student_avg = np.mean(scores, axis=1)
print("各学生の平均点:", student_avg)
# 出力: [84.33 91.67 80.33 89.   92.33]

# 各科目の平均点(列方向に計算)
subject_avg = np.mean(scores, axis=0)
print("各科目の平均点:", subject_avg)
# 出力: [87.2 88.8 86.6]

# 全体の平均点
total_avg = np.mean(scores)
print("全体の平均:", total_avg)
# 出力: 87.53

# 最高点と最低点
print("最高点:", np.max(scores))  # 95
print("最低点:", np.min(scores))  # 76

条件を使ったデータ処理

# 80点以上の科目数を数える
high_scores = scores >= 80
count = np.sum(high_scores, axis=1)
print("80点以上の科目数:", count)
# 出力: [2 3 2 3 3]

# 90点以上の点数だけ抽出
excellent = scores[scores >= 90]
print("90点以上:", excellent)
# 出力: [90 92 95 92 95 93]

このように、NumPyを使えばデータ分析が簡単にできます。

実際の速度を比べてみよう

リンドくん

リンドくん

NumPyって本当に速いんですか?実際に見てみたいです!

たなべ

たなべ

それじゃあ比較してみよう。同じ処理をNumPyとPythonリストでやった場合の違いを見てもらうよ。

速度比較

import numpy as np
import time

# 100万個のデータを準備
size = 1000000
python_list = list(range(size))
numpy_array = np.arange(size)

# Pythonリストで処理(リスト内包表記)
start = time.time()
result_list = [x * 2 for x in python_list]
time_list = time.time() - start
print(f"Pythonリスト: {time_list:.4f}秒")

# NumPyで処理
start = time.time()
result_numpy = numpy_array * 2
time_numpy = time.time() - start
print(f"NumPy: {time_numpy:.4f}秒")

# 何倍速いか
print(f"NumPyは約{time_list / time_numpy:.1f}倍速い!")

# 実行結果の例
# Pythonリスト: 0.0856秒
# NumPy: 0.0034秒
# NumPyは約25.2倍速い!

データ量が多いほど、NumPyの速さが際立ちます。これがデータサイエンスでNumPyが必須とされる理由です。

まとめ

リンドくん

リンドくん

NumPyって思ったよりシンプルですね!すぐに使えそうです。

たなべ

たなべ

その通り!基本をマスターすれば、データサイエンスやAI開発の土台がしっかりできるよ。ぜひ実際に手を動かして試してみてね。

NumPyの重要ポイントとまとめておきましょう。

  • 高速な数値計算 → 普通のPythonリストより10倍以上速い
  • シンプルな書き方 → ループを書かずに配列全体を処理できる
  • 豊富な関数 → 平均、合計、統計処理などが簡単にできる
  • データサイエンスの基盤 → Pandas、scikit-learn、TensorFlowなどの土台

NumPyは、データサイエンスやAI開発を学ぶ上で最初に身につけるべき重要なスキルです。
最初は難しく感じるかもしれませんが、基本的な使い方はとてもシンプルです。

実際に手を動かして、コードを書いてみることが上達への近道です。
今回紹介したコード例を試しながら、NumPyの便利さを体感してみてください。

この記事をシェア

関連するコンテンツ