こんにちは、小澤です。
今回は、これまで説明したNumPyについて、基本的な使い方から応用的な機能の復習をしましょう。教科書『Pythonによる新しいデータ分析の教科書(第2版)』の4.1章「NumPy」(92ページ〜134ページ)の部分です。
NumPyの基本
NumPyは、Pythonで数値計算を効率的に行うための基本的なライブラリです。データ分析、機械学習、科学計算などの分野で広く利用されています。NumPyの基本は、多次元配列(ndarrayオブジェクト)を中心に構成されており、これらの配列を操作するための便利な関数が豊富に提供されています。NumPyが提供する主な機能は以下です。
- 多次元配列(ndarray)
NumPyは、多次元配列オブジェクト(ndarray)を提供し、これを使うと、大規模なデータセットの操作を効率化できます。 - 数値計算
数学的関数や統計関数、線形代数、フーリエ変換、乱数生成など、多くの数値計算機能を含んでいます。 - ベクトル化演算
配列全体に対して要素ごとの演算を高速に行うことができ、ループを使わないベクトル化されたコードを書くことができます。
NumPyのインストールとインポート
NumPyを使用するには、まずライブラリをpipでインストールします。
pip install numpy |
そして、Pythonスクリプトではインポートして使用します。ここでは、npという別名で使えるようにインポートします。
import numpy as np |
多次元配列(ndarray)の基本的な使い方
NumPyの主力は多次元配列で、行列やテンソルのような多次元の数値データを効率的に扱うことができます。以下は、多次元配列を作成する例です。
# 1次元配列の作成 array_1d = np.array([1, 2, 3, 4, 5]) # 2次元配列の作成 array_2d = np.array([[1, 2, 3], [4, 5, 6]]) # 3次元配列の作成 array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) |
配列の属性を確認するには以下のような関数があります。
# 配列の形状 print(array_2d.shape) # (2, 3) # 配列の次元数 print(array_2d.ndim) # 2 # 配列の要素数 print(array_2d.size) # 6 # 配列のデータ型 print(array_2d.dtype) # int64 |
ブロードキャスト
NumPyは、行数や列数が異なる配列間でも自動的にブロードキャストが行われ、要素ごとの演算を可能にします。これにより、形状の異なる配列でも柔軟に計算ができます。
a = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([10, 20, 30]) result = a + b print(result) # [[11, 22, 33], [14, 25, 36]] |
データ型(dtype)
NumPyのdtype(データ型)は、配列が保持する要素のデータ型を表します。 arr_int = np.array([1, 2, 3], dtype=np.int32) arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float64) |
インデックスとスライス
NumPyのインデックスとスライスを使うことで、配列の特定の要素にアクセスしたり、範囲を取得したりできるので、データの操作や抽出が容易になります。
arr = np.array([1, 2, 3, 4, 5]) print(arr[0]) # 1 print(arr[-1]) # 5 matrix = np.array([[1, 2, 3], [4, 5, 6]]) print(matrix[0, 0]) # 1 print(matrix[1, -1]) # 6 arr = np.array([1, 2, 3, 4, 5]) print(arr[1:4]) # [2, 3, 4] print(arr[:3]) # [1, 2, 3] print(arr[::2]) # [1, 3, 5] |
データ再代入
NumPyでは、要素や部分配列に新しい値を割り当てることが簡単にできます。以下はデータの再代入の例です。
arr_np = np.array([1, 2, 3, 4, 5]) arr_np[2] = 10 # [ 1, 2, 10, 4, 5] arr_np[:3] = [6, 7, 8] # [6, 7, 8, 4, 5] |
参照とコピー
NumPyの配列における参照とコピーの挙動についても重要です。参照は元の配列とデータを共有し、コピーは独立した配列を作成します。
arr = np.array([1, 2, 3, 4, 5]) arr_ref = arr # 参照 arr_ref[0] = 100 print(arr) # [100, 2, 3, 4, 5] arr_copy = arr.copy() # コピー arr_copy[0] = 100 print(arr) # [1, 2, 3, 4, 5] |
数列の生成
arange関数を使うと、数列を生成することができます。arangeは、指定した範囲内で等間隔の数値を生成するための関数です。
# 0から9までの整数を生成 int_array = np.arange(10) print(int_array) # [0 1 2 3 4 5 6 7 8 9] # 1から10未満まで2ずつ増加する数列を生成 step_array = np.arange(1, 10, 2) print(step_array) # [1 3 5 7 9] # 0.0から1.0未満まで0.1ずつ増加する数列を生成 float_array = np.arange(0.0, 1.0, 0.1) print(float_array) # [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] # データ型を指定して範囲を生成 typed_array = np.arange(5, dtype=float) print(typed_array) # [0. 1. 2. 3. 4.] |
乱数数列の生成
NumPyのrandomモジュールを使用すると、ランダムな数列を生成することができます。NumPyでの乱数生成には「最新のRandom Generator」と「旧来からあるLegacy Generator」の2つがありますが、推奨されているのは「最新のRandom Generator」を使った方法です。default_rng()は、NumPyの1.17バージョン以降で導入された新しい乱数生成器(RNG)APIを使用しており、これによって、より性能が良い乱数が生成できます。
# 新しい乱数生成器インスタンスを作成 rng = np.random.default_rng() # 0から1の間の乱数を生成 random_integers = rng.random(5) print(random_floats) # [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ] # 0から10の間の整数を生成 random_integers = rng.integers(0, 11, size=5) print(random_integers) # [3 7 9 3 5] # 標準正規分布に従う乱数を生成 random_normals = rng.standard_normal(5) print(random_normals) # [ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323] |
ユニバーサルファンクション
NumPyのユニバーサルファンクション(ufuncs)は、配列の各要素に対して迅速かつ効率的に計算を実行するための関数です。以下は、配列の絶対値と正弦を計算する例です。
b = np.arange(-3, 3).reshape((2, 3)) abs_b = np.abs(b) print(abs_b) # [[3, 2, 1], [0, 1, 2]] e = np.linspace(-1, 1, 10) sin_e = np.sin(e) print(sin_e) # [-0.84147098, -0.70169788, …, 0.84147098] |
真偽値と比較
NumPyには、配列の要素を一括でチェックして、その結果を真偽値(ブール値:True or False)として返す関数や演算子が提供されています。これにより、データのフィルタリングや分析を効率的に行うことができます。
a = np.array([0, 4, -5, 2]) bool_array = a > 3 print(bool_array) # [False, True, False, False] b = np.array([[1, 2, 8], [4, 5, 3]]) bool_array = b > 3 print(bool_array) # [[False, False, True], [True, True, False]] |
まとめ
NumPyは、Pythonにおける数値計算やデータ処理に特化したライブラリで、その柔軟性と効率性から広く使用されています。NumPyの基本的な操作から始まり、配列操作、ブロードキャスト、ユニバーサルファンクション、真偽値と比較といった応用的な機能を学ぶことで、データ分析をさらに強化することができます。NumPyを活用して、データ分析のスキルをさらに向上させていきましょう。 次回からは、Pandasを学んでいく予定です。ぜひお楽しみにしてください。