このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】数値計算を効率的に行うNumPy

数値計算を効率的に行うNumPy

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

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.NumPyを使うための準備

 NumPyをインストールしていない場合は、次のようにコマンドを実行してください。Anaconda環境では既に含まれていることが多いですが、必要に応じてインストールを確認します。

環境コマンド備考
CPython(通常のPython)pip install numpypipの実行時に管理者権限が必要な場合あり
Anaconda/Minicondaconda 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")。

 実行結果として、gradesnumpy.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.]

プログラムの解説

  1. np.loadtxt(csv_path, delimiter=",")
    CSVファイルを NumPy 配列として読み込む。区切り文字がカンマの場合は必須。
  2. scores.shape
    (行数, 列数) のタプルを返し、どのくらいのデータ量かを把握できる。
  3. scores.mean(axis=0) / scores.sum(axis=0)
    axis=0 は配列の「行をまたいで」集計するため、列ごとの平均・合計を返す。
  4. print(f"...")
    f-stringを使った文字列フォーマットで可読性高く表示。

 上記のセルをJupyterLabで実行すれば、CSVファイルに含まれる3科目(仮定)について、それぞれの平均点と合計点が表示されます。行数や列数が変わっても、NumPyの関数を変えなくていいのが便利なポイントです。

まとめ

 NumPyを用いると、大量の数値データを効率的に取り扱うことができます。CSVファイルをひとたび読み込めば、スライスによる一部抜き出しや、平均・合計・標準偏差などの統計量の算出をシンプルなコードで実装できます。機械学習やビッグデータの分野でも必須のライブラリなので、配列操作や関数の使い方をしっかり押さえておくと、後々非常に役立つでしょう。次のステップとして、さらに高度な行列演算やブロードキャスト機能など、NumPy独自の仕組みを学ぶと、大規模データ処理の効率が格段に向上します。