NumPy(Numerical Python)は、Pythonの科学技術計算を支える強力なライブラリです。特に、多次元配列を効率的に操作するための機能を提供し、大規模なデータセットの高速計算を実現します。
なぜ配列計算が重要なのか?
配列計算は、データ分析、機械学習、画像処理、統計モデリングなど、幅広い分野で必要不可欠です。NumPyを使うことで、以下のような利点が得られます:
- 高速性:Python標準のリストよりもはるかに高速な演算が可能。
- シンプルさ:数学的な操作を簡潔なコードで実現。
- 柔軟性:多次元配列をサポートし、線形代数や統計計算などにも対応。
NumPyの使い方を習得することで、より効率的にプログラミングを進めることができるでしょう。本記事では、NumPyでの「配列計算」に特化して学びます。
配列の四則演算
NumPyを使うことで、複雑な配列の四則演算(加算、減算、乗算、除算)を簡単かつ効率的に行うことができます。ここでは、関数と演算子の両方を使った配列同士の計算方法を詳しく解説します。
配列の準備
まずは、計算に使用する配列を用意します。以下のコード例では、2つの1次元配列 arr1
と arr2
を作成しています。
import numpy as np
# 配列の作成
arr1 = np.array([100, 200, 300])
arr2 = np.array([30, 40, 50])
配列同士の加算
NumPyでは、配列同士の加算を numpy.add()
関数 か、+
演算子 を使って実現できます。
# 加算
print(np.add(arr1, arr2)) # 関数を使用
print(arr1 + arr2) # 演算子を使用
出力:
[130 240 350]
[130 240 350]
どちらの方法でも同じ結果が得られます。
配列同士の減算
配列同士の減算には numpy.subtract()
関数 または -
演算子 を使います。
# 減算
print(np.subtract(arr1, arr2)) # 関数を使用
print(arr1 - arr2) # 演算子を使用
出力:
[70 160 250]
[70 160 250]
配列同士の乗算
乗算を行うには numpy.multiply()
関数 か *
演算子 を使用します。
# 乗算
print(np.multiply(arr1, arr2)) # 関数を使用
print(arr1 * arr2) # 演算子を使用
出力:
[3000 8000 15000]
[3000 8000 15000]
配列同士の除算
除算には numpy.divide()
関数 または /
演算子 を使用します。
# 除算
print(np.divide(arr1, arr2)) # 関数を使用
print(arr1 / arr2) # 演算子を使用
出力:
[3.33333333 5. 6. ]
[3.33333333 5. 6. ]
まとめ
配列の四則演算は、関数と演算子のどちらでも簡単に実現できます。以下はそれぞれの対応表です:
演算 | 関数 | 演算子 |
---|---|---|
加算 | numpy.add | + |
減算 | numpy.subtract | - |
乗算 | numpy.multiply | * |
除算 | numpy.divide | / |
実践課題
以下のコードを実行して、配列の四則演算に慣れてみましょう。
課題:
arr1
とarr2
の加算結果を出力してみよう。arr1
とarr2
の減算結果を出力してみよう。arr1
とarr2
の乗算結果を出力してみよう。arr1
とarr2
の除算結果を出力してみよう。
import numpy as np
# 配列の作成
arr1 = np.array([100, 200, 300])
arr2 = np.array([30, 40, 50])
# 四則演算の実践
# (1) 加算
print(arr1 + arr2)
# (2) 減算
print(arr1 - arr2)
# (3) 乗算
print(arr1 * arr2)
# (4) 除算
print(arr1 / arr2)
その他の便利な数値計算
NumPyは四則演算以外にも、指数関数、対数関数、三角関数、平方根など、多様な数値計算を簡単に行うための関数を提供しています。本章では、これらの関数を使用した便利な計算方法を具体例とともに解説します。
指数関数
指数関数は、ネイピア数 ee(約2.718)を底として、数値や配列の各要素に対して累乗を計算する関数です。NumPyでは numpy.exp()
を使います。
例: 数値と配列の指数関数計算
import numpy as np
# 数値の指数関数
print(np.exp(2)) # e^2 を計算
# 配列の指数関数
arr = np.array([0.1, 1, np.e])
print(np.exp(arr)) # 各要素に対して e^x を計算
出力:
7.38905609893065
[1.10517092 2.71828183 15.15426224]
課題: 指数関数を試してみよう
配列 [0.1, 1, np.e]
を使って、各要素の指数関数を計算してみましょう。
対数関数
対数関数は、数値や配列の各要素に対して対数を計算します。NumPyでは以下の関数が用意されています:
numpy.log()
: 自然対数(底 ee の対数)numpy.log2()
: 底が 2 の対数(二進対数)numpy.log10()
: 底が 10 の対数(常用対数)
例: 数値と配列の対数計算
# 自然対数
print(np.log(np.e)) # log(e) = 1
# 配列の自然対数
arr = np.array([0.1, 1, np.e])
print(np.log(arr)) # 各要素の自然対数を計算
# 二進対数と常用対数
print(np.log2(8)) # log2(8) = 3
print(np.log10(1000)) # log10(1000) = 3
出力:
1.0
[-2.30258509 0. 1. ]
3.0
3.0
課題: 自然対数を計算してみよう
配列 [0.1, 1, np.e]
を使って、各要素の自然対数を計算してみましょう。
三角関数
NumPyでは正弦関数、余弦関数、正接関数をそれぞれ numpy.sin()
, numpy.cos()
, numpy.tan()
で計算できます。注意点として、角度はラジアン(弧度法)で指定する必要があります。
例: 三角関数の計算
# 数値での三角関数
print(np.sin(np.pi)) # sin(π)
print(np.cos(np.pi)) # cos(π)
print(np.tan(np.pi)) # tan(π)
# 配列での三角関数
arr = np.linspace(-np.pi, np.pi, 5) # -π〜πの範囲を5分割
print(np.sin(arr)) # 各要素のsin値を計算
出力:
1.2246467991473532e-16
-1.0
-1.2246467991473532e-16
[ 0.0000000e+00 7.0710678e-01 1.0000000e+00 7.0710678e-01
0.0000000e+00]
三角関数の波形を可視化
Matplotlibを使うと、三角関数の波形を簡単に視覚化できます。以下の関数を使って波形をプロットしてみましょう:
import matplotlib.pyplot as plt
# 波形をプロットする関数
def wave_plot(arr, result, ylabel):
plt.plot(arr, result)
plt.xlabel('Angle [rad]')
plt.ylabel(ylabel)
plt.axis('tight')
plt.show()
# ラジアンの配列を作成
arr = np.linspace(-np.pi, np.pi, 100)
# 正弦波のプロット
wave_plot(arr, np.sin(arr), ylabel='sin(x)')
# 余弦波のプロット
wave_plot(arr, np.cos(arr), ylabel='cos(x)')
# 正接波のプロット
wave_plot(arr, np.tan(arr), ylabel='tan(x)')
課題
- 配列
[-π, -π/2, 0, π/2, π]
の正弦、余弦、正接を計算しよう。 - 波形プロット関数を使用して、正弦波、余弦波、正接波を描画しよう。
まとめ
NumPyには四則演算以外にも、指数関数、対数関数、三角関数といった豊富な数値計算機能が用意されています。これらを活用すれば、より高度なデータ処理や解析が可能になります。次章では、平方根や内積といった応用的な配列計算を学びます。
応用的な配列計算
NumPyでは、配列の平方根計算や内積計算など、より応用的な計算も簡単に実行できます。本章では、それぞれの方法を具体例とともに解説します。
配列の平方根計算
平方根は numpy.sqrt()
関数を使って計算します。この関数を使用すると、配列の各要素に平方根を適用し、新しい配列として結果を得ることができます。
例: 配列の平方根を求める
import numpy as np
# 配列の作成
arr = np.array([0, 100, 10000])
# 平方根の計算
result = np.sqrt(arr)
print(result)
出力:
[ 0. 10. 100.]
ポイント
- 負の数を含む配列に対して平方根を計算しようとするとエラーが発生します。例えば
np.sqrt(-1)
のような場合です。そのような場合には 複素数計算 を考慮する必要がありますが、ここでは割愛します。
課題: 平方根の計算
次の配列の平方根を計算してみましょう:arr = np.array([1, 4, 9, 16, 25])
配列の内積計算
内積は、2つの配列間で対応する要素を掛け合わせ、その結果を合計することで計算されます。NumPyでは、numpy.dot()
関数を使用して簡単に内積を求めることができます。
例: 配列同士の内積を求める
# 配列の作成
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 内積の計算
result = np.dot(arr1, arr2)
print(result)
出力:
32
計算の詳細: 1×4+2×5+3×6=321 \times 4 + 2 \times 5 + 3 \times 6 = 32
ポイント
- 配列の要素数が異なる場合、エラーが発生します。例えば、
arr1 = [1, 2, 3]
とarr2 = [4, 5]
のような場合です。 - 2次元配列や多次元配列に対して
numpy.dot()
を使用すると、行列積が計算されます。
課題: 内積の計算
次の配列同士の内積を計算してみましょう:arr1 = np.array([10, 20, 30])
arr2 = np.array([1, 2, 3])
多次元配列の応用例: 行列積
2次元配列(行列)を扱う場合、内積ではなく行列積を計算することもできます。これも numpy.dot()
で実行可能です。
例: 行列積の計算
# 2次元配列の作成
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 行列積の計算
result = np.dot(matrix1, matrix2)
print(result)
出力:
[[19 22]
[43 50]]
計算の詳細: [1234]⋅[5678]=[1×5+2×71×6+2×83×5+4×73×6+4×8]=[19224350]\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \cdot \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} = \begin{bmatrix} 1 \times 5 + 2 \times 7 & 1 \times 6 + 2 \times 8 \\ 3 \times 5 + 4 \times 7 & 3 \times 6 + 4 \times 8 \end{bmatrix} = \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix}
実践課題
- 配列
arr1 = [2, 4, 6]
とarr2 = [1, 3, 5]
の内積を計算しよう。 - 次の行列の行列積を計算しよう:
matrix1 = [[1, 0], [0, 1]]
matrix2 = [[2, 3], [4, 5]]
まとめ
- 平方根計算 では
numpy.sqrt()
を使い、配列の各要素に対して効率的に平方根を適用できます。 - 内積計算 は
numpy.dot()
を使用して、1次元配列の内積や多次元配列の行列積を計算できます。 - 内積や行列積は、機械学習や数値シミュレーションなど、多くの場面で重要な役割を果たします。
次章では、実際の活用例を取り上げながら、配列計算の応用について学びます。
実践例とまとめ
これまでに学んだNumPyの配列計算を活用すると、実際のデータ分析や機械学習の場面でも役立つ計算が簡単に行えるようになります。本章では、実践的な活用例をいくつか取り上げながら、NumPyの配列計算の重要性を再確認し、記事をまとめます。
実践例: 配列計算でデータ分析
NumPyを使えば、配列を用いたデータ分析が簡単に行えます。以下に、基本的なデータ処理の例を示します。
例1: 平均・分散・標準偏差の計算
ある商品の1週間の売上データが次のように与えられているとします:
import numpy as np
# 売上データ(1週間分)
sales = np.array([150, 200, 250, 300, 400, 350, 500])
# 平均
mean_sales = np.mean(sales)
print("平均:", mean_sales)
# 分散
variance_sales = np.var(sales)
print("分散:", variance_sales)
# 標準偏差
std_sales = np.std(sales)
print("標準偏差:", std_sales)
出力:
平均: 307.14285714285717
分散: 14591.836734693878
標準偏差: 120.84473134102239
解説:
- 平均値 (
numpy.mean
) はデータの中心的な値を表します。 - 分散 (
numpy.var
) はデータのばらつきを示します。 - 標準偏差 (
numpy.std
) は分散の平方根で、データのばらつきを直感的に理解するのに役立ちます。
例2: 配列計算を用いたスケーリング(正規化)
機械学習では、データを一定の範囲に収める「正規化」がよく行われます。次の例では、売上データを0~1の範囲にスケーリングしています。
# 正規化 (0〜1にスケーリング)
min_sales = np.min(sales)
max_sales = np.max(sales)
normalized_sales = (sales - min_sales) / (max_sales - min_sales)
print("正規化された売上データ:", normalized_sales)
出力:
正規化された売上データ: [0. 0.11111111 0.22222222 0.33333333 0.66666667 0.55555556 1. ]
解説:
- データ全体の最小値・最大値を基準に計算することで、すべての値が0〜1の範囲に収まります。
- 正規化によって異なるスケールのデータを比較可能にすることができます。
例3: 条件に基づくフィルタリング
例えば、売上が300以上の日だけを抽出する場合、次のように計算できます:
# 売上が300以上の日を抽出
high_sales = sales[sales >= 300]
print("売上が300以上の日:", high_sales)
出力:
売上が300以上の日: [300 400 350 500]
解説:
- NumPyでは配列の条件式をそのままフィルタリングに使えるため、効率的に特定条件のデータを抽出できます。
実践例: 配列計算を活用した行列操作
例: 線形方程式の解を求める
NumPyを使うと、線形代数的な計算も簡単に行えます。たとえば、次の連立方程式を解くには: 2x+y=5x+3y=62x + y = 5 \\ x + 3y = 6
# 係数行列
A = np.array([[2, 1],
[1, 3]])
# 定数ベクトル
b = np.array([5, 6])
# 線形方程式の解を求める
x = np.linalg.solve(A, b)
print("連立方程式の解:", x)
出力:
連立方程式の解: [1. 2.]
解説:
numpy.linalg.solve()
を使うと、行列 AA とベクトル bb を基に、未知数 xx を簡単に求めることができます。
まとめ
NumPy配列計算のメリット
- 高速性: 大量データを高速に処理可能。
- 簡潔さ: 複雑な数値計算もシンプルなコードで実現。
- 柔軟性: 多次元配列や線形代数、統計計算にも対応。
次の学習ステップ
この記事で紹介した内容を基礎として、次のトピックに挑戦してみましょう:
- 多次元配列の操作(スライスや転置)
- 行列の固有値計算や特異値分解
- NumPyを活用したデータの可視化(Matplotlibとの組み合わせ)
- pandasと連携してデータフレームを使った分析
コメント