NumPy 使い方一覧 徹底解説: Pythonで高速数値計算をマスター!


 

データサイエンス、機械学習、科学技術計算、画像処理など、Pythonを使った数値計算のほぼすべての領域で、**NumPy(ナンパイ)は不可欠なライブラリです。その中核をなすndarray(N次元配列)**は、Pythonのリストよりもはるかに高速かつ効率的に、大量の数値データを処理することを可能にします。

この記事では、NumPyの基本的な使い方から、効率的な配列操作、そして実用的な計算テクニックまで、NumPyを使いこなすために必要な機能を網羅的に解説します。


 

NumPyってどんなもの?

 

NumPyは、「Numerical Python」の略で、Pythonで数値計算を効率的に行うためのライブラリです。特に、多次元配列オブジェクトである**ndarray**を提供し、このndarrayに対する高速な演算機能がNumPyの最大の強みです。

 

NumPyの主な特徴

 

  • ndarray: 高速でメモリ効率の良い多次元配列オブジェクト。Pythonのリストと異なり、すべての要素が同じデータ型である必要があります。

  • ベクトル化演算: 配列全体に対して一度に演算を適用できるため、forループを使うよりもはるかに高速です。

  • 広範な数学関数: 線形代数、フーリエ変換、乱数生成など、多岐にわたる数学関数が提供されています。

  • C/C++/Fortranとの連携: 内部的にC言語などで実装されているため、非常に高いパフォーマンスを発揮します。

  • Pandas、SciPy、Scikit-learnなどの基盤: 多くのPythonの科学計算ライブラリがNumPyを基盤としています。


 

なぜNumPyを選ぶべきか?

 

Pythonの標準機能だけでも数値計算は可能ですが、NumPyを使うことには以下のような圧倒的なメリットがあります。

  • 圧倒的な高速性: 大規模な配列演算において、Pythonのリストやforループと比較して、数十倍から数百倍の高速化を実現します。

  • メモリ効率: 大量の数値データをコンパクトに格納し、メモリ使用量を抑えます。

  • 簡潔なコード: ベクトル化された操作により、複雑な計算も1行で記述できるため、コードが読みやすくなります。

  • 科学技術計算のデファクトスタンダード: 他の多くのライブラリと連携しやすく、エコシステムの中核をなしています。


 

NumPyを始めるための準備

 

 

1. インストール

 

NumPyはpipで簡単にインストールできます。

Bash
 
pip install numpy

 

2. インポート

 

PythonスクリプトでNumPyを使用する際は、慣習としてnpというエイリアスでインポートします。

Python
 
import numpy as np

 

NumPyの基本的な使い方と機能一覧

 

 

1. ndarrayの作成

 

NumPyの最も基本的な要素はndarray(N-dimensional array)です。

Python
 
# リストから配列を作成
arr1d = np.array([1, 2, 3, 4, 5])
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print("1D配列:\n", arr1d)
print("2D配列:\n", arr2d)
print("配列の形状 (shape):", arr2d.shape)
print("配列の次元数 (ndim):", arr2d.ndim)
print("配列の要素数 (size):", arr2d.size)
print("要素のデータ型 (dtype):", arr2d.dtype)
print("\n")

# 特定の値で初期化
zeros_arr = np.zeros((2, 3)) # 0で初期化
ones_arr = np.ones((2, 2))   # 1で初期化
full_arr = np.full((2, 2), 7) # 指定した値で初期化
print("zeros:\n", zeros_arr)
print("ones:\n", ones_arr)
print("full (7):\n", full_arr)
print("\n")

# 連続する値
range_arr = np.arange(10)      # 0から9まで
linspace_arr = np.linspace(0, 1, 5) # 0から1までを5等分
print("arange:\n", range_arr)
print("linspace:\n", linspace_arr)
print("\n")

# ランダムな値
rand_arr = np.random.rand(2, 2) # 0-1の一様乱数
randint_arr = np.random.randint(0, 10, (2, 2)) # 0-9の整数乱数
print("rand:\n", rand_arr)
print("randint:\n", randint_arr)
print("\n")

 

2. インデックス参照とスライス

 

Pythonリストと同様に、配列の要素にアクセスしたり、部分配列を取り出したりできます。

Python
 
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("元の配列:\n", arr)

# 単一要素
print("arr[0, 0]:", arr[0, 0]) # 1行0列目の要素
print("\n")

# スライス
print("arr[0, :]:", arr[0, :])   # 0行目全体
print("arr[:, 1]:", arr[:, 1])   # 1列目全体
print("arr[:2, 1:]:\n", arr[:2, 1:]) # 0-1行目、1列目以降
print("\n")

# 条件による選択 (ブールインデックス参照)
print("arr[arr > 5]:", arr[arr > 5]) # 5より大きい要素 (1D配列になる)
print("\n")

 

3. 配列の形状操作

 

配列の形状を変更したり、次元を追加・削除したりできます。

Python
 
arr = np.arange(12)
print("元の配列:", arr)

# 形状変更 (reshape)
reshaped_arr = arr.reshape(3, 4)
print("reshape (3, 4):\n", reshaped_arr)
print("\n")

# 次元を平坦化 (flatten, ravel)
flat_arr = reshaped_arr.flatten()
print("flatten:\n", flat_arr)
print("\n")

# 次元を追加 (newaxis, expand_dims)
arr_col = arr1d[:, np.newaxis] # 1D配列を列ベクトルにする
print("列ベクトル化:\n", arr_col)
print("形状:", arr_col.shape)
print("\n")

 

4. 算術演算とブロードキャスティング

 

NumPy配列は、要素ごとの算術演算を非常に効率的に行えます。異なる形状の配列間で演算を行う「ブロードキャスティング」機能も強力です。

Python
 
arr_a = np.array([[1, 2], [3, 4]])
arr_b = np.array([[5, 6], [7, 8]])

# 要素ごとの加算、減算、乗算、除算
print("加算:\n", arr_a + arr_b)
print("乗算:\n", arr_a * arr_b)
print("\n")

# スカラーとの演算 (ブロードキャスティング)
print("arr_a + 10:\n", arr_a + 10)
print("\n")

# 異なる形状の配列との演算 (ブロードキャスティング)
vec = np.array([10, 20])
print("arr_a + vec:\n", arr_a + vec) # (2,2) + (2,) => 行ごとに加算
print("\n")

 

5. 集計関数

 

配列全体または特定の軸(行/列)に沿って、統計量を計算できます。

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

print("元の配列:\n", arr)
print("合計:", np.sum(arr))        # 全要素の合計
print("行ごとの合計:", np.sum(arr, axis=1)) # axis=1は行方向(列ごとの合計)
print("列ごとの合計:", np.sum(arr, axis=0)) # axis=0は列方向(行ごとの合計)
print("平均:", np.mean(arr))
print("最大値:", np.max(arr))
print("最小値:", np.min(arr))
print("標準偏差:", np.std(arr))
print("\n")

 

6. 線形代数

 

NumPyは線形代数演算もサポートしています。

Python
 
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 行列の積 (dot product)
print("行列の積 (dot):\n", A.dot(B))
print("行列の積 (@演算子):\n", A @ B) # Python 3.5以降
print("\n")

# 転置 (transpose)
print("Aの転置:\n", A.T)
print("\n")

# 逆行列
try:
    inv_A = np.linalg.inv(A)
    print("Aの逆行列:\n", inv_A)
except np.linalg.LinAlgError:
    print("逆行列は存在しません。")
print("\n")

 

7. ファイルI/O

 

NumPy配列をファイルに保存したり、ファイルから読み込んだりできます。

Python
 
# 配列を.npyファイルに保存
np.save('my_array.npy', arr)

# .npyファイルから配列を読み込み
loaded_arr = np.load('my_array.npy')
print("ファイルから読み込んだ配列:\n", loaded_arr)
print("\n")

# テキストファイルとして保存 (CSVなど)
np.savetxt('my_data.csv', arr, delimiter=',')

# テキストファイルから読み込み
loaded_txt_arr = np.loadtxt('my_data.csv', delimiter=',')
print("CSVから読み込んだ配列:\n", loaded_txt_arr)
print("\n")

 

NumPyをより深く使いこなすために

 

  • データ型 (dtype): メモリ効率や計算精度に影響します。int32, float64など、適切な型を選択することが重要です。

  • メモリビュー: NumPyのスライスは多くの場合、元の配列のコピーではなく「ビュー」を返します。これはメモリ効率が良い反面、元の配列が変更される可能性があるため注意が必要です。明示的にコピーしたい場合はcopy()メソッドを使います。

  • ufunc (Universal Functions): np.add, np.sqrt, np.expなどのNumPy関数は、要素ごとに高速に演算を行うufuncです。

  • マスク処理: ブール配列を使って、特定の条件を満たす要素のみに操作を適用できます。


 

まとめ

 

この記事では、Pythonの数値計算における基盤となるNumPyライブラリについて、その中核であるndarrayの作成から、インデックス参照、形状操作、算術演算、集計、線形代数、ファイルI/Oまで、主要な使い方を網羅的に解説しました。

NumPyをマスターすることは、データサイエンスや機械学習の道を歩む上で避けては通れないステップです。NumPyの強力な機能と高速性を理解し、使いこなすことで、あなたのPythonでの数値計算能力は飛躍的に向上するでしょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座