概要
Pythonは、データサイエンティストや研究者にとって人気があるプログラミング言語です。Pythonは、機械学習やデータ分析のための多くのパッケージを提供していますが、数値計算には最適ではありません。
ここで、NumPy(Numerical Python)が登場します。NumPyは、Python用の数値演算ライブラリであり、CまたはFortranで書かれているため、高速な数値計算を実行できます。この記事では、NumPyの利点、NumPyの操作方法、NumPyの配列周りの基本的な演算、およびその他の数値計算ライブラリ(例えば、SciPy)について説明します。
NumPyの利点
NumPyには、Pythonにはない多くの高度な数学関数とアルゴリズムが含まれています。また、NumPyの配列は、Pythonの通常のリストよりも優れた特性を持ちます。
- データを格納するための効率的なデータ構造
- 多次元配列の処理を容易にするツール
- 高速で、メモリ使用量が少ない
- 手軽に配列の要素を操作可能
NumPyの基本
NumPyは、ndarray(n-dimensional array)オブジェクトを中心に構成されています。ndarrayオブジェクトは、一次元または多次元の配列を扱うために使用できます。このセクションでは、ndarrayオブジェクトの作成方法、インデックス付け、スライシング、およびndarrayオブジェクトの基本的な演算について説明します。
実装例
import numpy as np
# 1次元のndarrayの作成
arr1 = np.array([1, 2, 3])
print(arr1)
# 出力結果: [1 2 3]
# 2次元のndarrayの作成
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 出力結果: [[1 2 3]
# [4 5 6]]
# インデックスを使って要素にアクセス
print(arr1[0]) # 1
print(arr2[0][1]) # 2
# スライスを使った要素へのアクセス
print(arr1[1:]) # [2 3]
print(arr2[:, :2]) # [[1 2]
# [4 5]]
# ndarray同士の演算
arr3 = arr1 + arr2
print(arr3)
# 出力結果: [[2 4 6]
# [5 7 9]]
このように、NumPyのndarrayはPython標準のリストよりも高速で、多次元配列も簡単に扱えます。したがって、NumPyを使用することで、高速かつ柔軟性のある数値計算を行うことができます。
NumPyの演算
NumPyの主な機能は、配列の演算です。NumPyは、膨大な数の数学演算子および数学関数を提供しています。 このセクションでは、NumPyの配列演算、および他の重要な数値演算ライブラリであるSciPy(Scientific Python)について説明します。
NumPyの配列演算
NumPyで配列の要素同士を演算する実装例です。
import numpy as np
# NumPyの配列を作る
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 配列同士の足し算
c = a + b
print(c) # [5 7 9]
# 配列同士の引き算
d = a - b
print(d) # [-3 -3 -3]
# 配列同士の掛け算
e = a * b
print(e) # [ 4 10 18]
# 配列同士の割り算
f = a / b
print(f) # [0.25 0.4 0.5 ]
# 配列要素の累乗
g = a ** 2
print(g) # [1 4 9]
# 配列要素の三角関数
h = np.sin(a)
print(h) # [0.84147098 0.90929743 0.14112001]
上記の例では、まずNumPyのnp.arrayメソッドを使って2つの配列aとbを作成しました。その後、各配列要素同士の足し算、引き算、掛け算、割り算、累乗、三角関数など、様々な演算を行っています。これらの演算はPythonの普通のリストではできなかった高速な計算ができます。
NumPyとSciPy
最適化
SciPyは最適化問題の解法を提供しています。例えば、以下のように、最小値を求める関数を最適化する場合は、minimize
関数を用いて解を求めることができます。
from scipy.optimize import minimize
def f(x):
return (x - 2) ** 2 + 1
result = minimize(f, x0=0)
print(result.x) # [1.99999999]
統計分析
SciPyは様々な統計処理も提供しています。例えば、正規分布に従う乱数を生成する場合は、以下のようにrandn
関数を使うことができます。
from scipy.stats import randn
a = randn(1000) # 正規分布に従う乱数を1000個生成する
また、平均値や標準偏差などの統計量を計算することもできます。
from scipy.stats import norm
a = randn(1000)
mean = np.mean(a) # 平均値
stddev = np.std(a) # 標準偏差
# 正規分布の累積分布関数(CDF)を計算する
cdf_value = norm(mean, stddev).cdf(0)
print(mean, stddev, cdf_value)
以上が、NumPyとSciPyの実装例です。参考にしてみてください。
まとめ
この記事では、NumPyの作り方、ndarrayオブジェクトの作成、NumPyの配列演算について説明しました。NumPyの配列は、Pythonリストと比べて多くの点で優れた特性を持ちます。 NumPyを使うことで、高速で効率的な数値計算ができるようになります。