このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Python入門】数値計算を効率的に行うNumPy

数値計算を効率的に行うNumPy
データサイエンスや機械学習で膨大な数値情報を取り扱う場合、Pythonの数値演算ライブラリ「NumPy」を使うと非常に効率的です。NumPyには配列(行列)をはじめとする多数の数値処理機能が用意されており、大規模データを素早く計算・分析することが可能になります。ここでは、CSVファイルから数値データを読み込み、配列として扱う基本的な手法について解説します。

プログラムのダウンロード
「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。
1.NumPyを使うための準備
NumPyをインストールしていない場合は、次のようにコマンドを実行してください。Anaconda環境では既に含まれていることが多いですが、必要に応じてインストールを確認します。
環境 | コマンド | 備考 |
---|---|---|
CPython(通常のPython) | pip install numpy | pipの実行時に管理者権限が必要な場合あり |
Anaconda/Miniconda | conda install -y numpy | 追加パッケージも一括導入可能 |
NumPyのドキュメントは以下にまとまっています。
インストール後、Python(またはJupyterLab)の対話モードで次のようにインポートしてみましょう。
import numpy # または import numpy as np
何のエラーも表示されなければ、インストールは成功です。
2.CSVファイルを配列に読み込む
数値データを格納したCSVファイルをNumPyで読み込む場合、loadtxt()
関数を利用できます。区切り文字(デリミタ)をカンマ(,
)に指定すれば、すべての行を2次元の配列として取り込むことが可能です。
2.1.サンプルのCSVファイル(grades.csv)
以下の例では「grades.csv」というファイルを用意し、学年やクラスごとに異なる科目の成績データを記録していると想定します。ファイル内容はこのような形式です。
72,88,65
90,94,78
66,70,79
85,82,91
70,60,59
88,90,93
60,72,68
92,89,95
75,67,70
81,88,84
ここで、各行は3科目(例えば英語・数学・理科)に対応し、3列の数値で表していると考えます。
2.2.loadtxt関数による読み込み
JupyterLabのセルに、以下のコードを貼り付けて実行してください。ファイルがカレントディレクトリにあるか、適切なパスを指定している必要があります。
import numpy as np
# CSVファイル "grades.csv" を読み込み
grades = np.loadtxt("grades.csv", delimiter=",")
# 配列の中身を表示(大量の場合、省略されることもある)
grades
実行結果
array([[72., 88., 65.],
[90., 94., 78.],
[66., 70., 79.],
[85., 82., 91.],
[70., 60., 59.],
[88., 90., 93.],
[60., 72., 68.],
[92., 89., 95.],
[75., 67., 70.],
[81., 88., 84.]])
filename
にはCSVファイル名やパスを指定します。delimiter=","
ではカンマ区切りを表し、空白区切りの場合は省略が可能です。encoding
を指定すると、ファイルがUTF-8以外のエンコーディングでも読み込めます(例:encoding="utf-8"
)。
実行結果として、grades
は numpy.ndarray
型の2次元配列となります。数値のみが書かれたCSVファイルであれば、一気に読み込んで数値計算に移ることが可能です。
3.配列の基本操作(スライスや属性の確認)
読み込んだ配列が多くの行列要素を含む場合、全部を眺めても把握しにくいかもしれません。そこで、先頭数行だけまたは末尾数行だけを確認するといった操作を「スライス構文」で簡単に行えます。
3.1.先頭・末尾の行を抜き出す
# 最初の5行を表示
print("----- 最初の5行 -----")
print(grades[:5])
# 最後の5行を表示
print("----- 最後の5行 -----")
print(grades[-5:])
実行結果
----- 最初の5行 -----
[[72. 88. 65.]
[90. 94. 78.]
[66. 70. 79.]
[85. 82. 91.]
[70. 60. 59.]]
----- 最後の5行 -----
[[88. 90. 93.]
[60. 72. 68.]
[92. 89. 95.]
[75. 67. 70.]
[81. 88. 84.]]
grades[:5]
は先頭から数えて5行を抜き出す。grades[-5:]
は末尾5行を抜き出す。
3.2.配列の形状や要素数を確認する
# 配列の形状 (行数, 列数) が返される
print("配列の形状:", grades.shape)
# 最上位の次元(=行数)のみを確認する場合、組み込み関数len()を使う
print("配列の行数:", len(grades))
実行結果
配列の形状: (10, 3)
配列の行数: 10
grades.shape
は(行数, 列数)
の形式で返されます(例:(200, 3)
)。len(grades)
は1次元目(=行)の数を返します。
4.サンプルプログラム:平均・合計などの統計量を表示する
ここでは、学習した内容を踏まえて「grades.csv」の各列に対する平均点や合計点を計算してみます。JupyterLabで動作させる形の例として示します。
import numpy as np
def analyze_scores(csv_path):
"""
指定されたCSVファイルから成績データを読み込み、
科目ごとの平均点と合計点を計算して表示するサンプル関数。
"""
# CSVファイル読み込み
scores = np.loadtxt(csv_path, delimiter=",")
# 配列の情報を確認
print("***** 配列の基本情報 *****")
print("shape:", scores.shape)
print("len :", len(scores))
print()
# 各列(科目)ごとの平均点と合計点を算出 (axis=0 は列方向)
mean_values = scores.mean(axis=0)
sum_values = scores.sum(axis=0)
# 結果を表示
print("***** 科目別の統計情報 *****")
print(f"平均点: {mean_values}")
print(f"合計点: {sum_values}")
# 実際に関数を呼び出して処理
analyze_scores("grades.csv")
実行結果
***** 配列の基本情報 *****
shape: (10, 3)
len : 10
***** 科目別の統計情報 *****
平均点: [77.9 80. 78.2]
合計点: [779. 800. 782.]
プログラムの解説
np.loadtxt(csv_path, delimiter=",")
CSVファイルを NumPy 配列として読み込む。区切り文字がカンマの場合は必須。scores.shape
(行数, 列数)
のタプルを返し、どのくらいのデータ量かを把握できる。scores.mean(axis=0)
/scores.sum(axis=0)
axis=0
は配列の「行をまたいで」集計するため、列ごとの平均・合計を返す。print(f"...")
f-stringを使った文字列フォーマットで可読性高く表示。
上記のセルをJupyterLabで実行すれば、CSVファイルに含まれる3科目(仮定)について、それぞれの平均点と合計点が表示されます。行数や列数が変わっても、NumPyの関数を変えなくていいのが便利なポイントです。
まとめ
NumPyを用いると、大量の数値データを効率的に取り扱うことができます。CSVファイルをひとたび読み込めば、スライスによる一部抜き出しや、平均・合計・標準偏差などの統計量の算出をシンプルなコードで実装できます。機械学習やビッグデータの分野でも必須のライブラリなので、配列操作や関数の使い方をしっかり押さえておくと、後々非常に役立つでしょう。次のステップとして、さらに高度な行列演算やブロードキャスト機能など、NumPy独自の仕組みを学ぶと、大規模データ処理の効率が格段に向上します。