このシリーズではE資格対策として、書籍「ゼロから作るDeep Learning」を参考に学習に役立つ情報をまとめています。

<参考書籍>

Numpyの概要

Numpyの概要

Numpy(Numerical Python)は、Pythonの高速で効率的な数値計算を行うためのライブラリです。Numpyは、多次元配列(ベクトルや行列)のサポートや、これらの配列に対する数学的な関数を提供します。また、C/C++やFortranのライブラリと簡単に連携できるように設計されており、高速な処理が可能です。

Numpyは、Pythonの科学技術計算の基盤となるライブラリであり、PandasやSciPy、Matplotlib、scikit-learnといった他の科学技術計算ライブラリとの親和性が高いです。

Numpyの主な用途

Numpyは、以下のような用途で広く使用されています。

  1. 配列操作: Numpyは、多次元配列を効率的に操作できます。これには、配列の生成、変形、結合、分割、インデックス操作やスライスなどが含まれます。
  2. 数学的計算: Numpyは、線形代数、統計処理、フーリエ変換、離散コサイン変換などの数学的計算をサポートしています。また、要素ごとの算術演算やブロードキャストも簡単に行えます。
  3. データ分析: Numpyは、大量のデータを効率的に処理するための高速なベクトル化計算を提供しています。これにより、データ分析や前処理が容易になります。
  4. 機械学習: Numpyは、機械学習ライブラリ(例えば、scikit-learnやTensorFlow)の基盤となっており、データの前処理や特徴抽出、学習アルゴリズムの実装に役立ちます。
  5. 画像処理: Numpyを使って、画像データを配列として扱い、フィルタリングや変換、エッジ検出などの画像処理を行うことができます。
  6. シミュレーション: Numpyは、物理学、化学、生物学、工学などの科学技術分野でシミュレーションやモデル化のために使用されます。

このように、Numpyは多様な分野で活用されており、Pythonの数値計算やデータ分析の基盤となっています。

Numpyの実装例

Numpyの配列生成

Numpyは、Pythonで高速な数値演算を行うためのライブラリです。配列生成の基本的な方法は、numpy.array()関数を使用することです。

import numpy as np

# Numpy配列の生成
arr = np.array([1, 2, 3, 4, 5])

# 出力
print(arr)

実行結果:

[1 2 3 4 5]

Numpyの算術計算

Numpyを使って、配列同士や配列とスカラーの算術計算が簡単に行えます。

import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])

# 要素ごとの加算
add_result = arr1 + arr2
print("Addition:", add_result)

# 要素ごとの減算
sub_result = arr1 - arr2
print("Subtraction:", sub_result)

# 要素ごとの乗算
mul_result = arr1 * arr2
print("Multiplication:", mul_result)

# 要素ごとの除算
div_result = arr1 / arr2
print("Division:", div_result)

実行結果:

Addition: [6 6 6 6 6]
Subtraction: [-4 -2  0  2  4]
Multiplication: [ 5  8  9  8  5]
Division: [0.2 0.5 1.  2.  5. ]

NumpyのN次元配列

Numpyでは、多次元配列を簡単に作成できます。例として、2次元配列(行列)を生成します。

import numpy as np

# 2次元配列の生成
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 出力
print(matrix)

実行結果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

Numpyのブロードキャスト

ブロードキャストは、形状の異なる配列間で算術演算を行うための仕組みです。

import numpy as np

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

# スカラー値を全要素に掛ける
broadcast_result = arr * scalar

# 出力
print(broadcast_result)

実行結果:

[ 2  4  6  8 10]

Numpyの要素へのアクセス

Numpy配列の要素にアクセスする方法は、リストやタプルと同様に、インデックスやスライスを使ってアクセスできます。また、多次元配列の場合、カンマ区切りでインデックスを指定します。

import numpy as np

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

# インデックスを使ったアクセス
print(arr[0])  # 1
print(arr[2])  # 3

# スライスを使ったアクセス
print(arr[1:4])  # [2 3 4]

# 2次元配列の場合
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# インデックスを使ったアクセス
print(matrix[1, 1])  # 5

# スライスを使ったアクセス
print(matrix[0:2, 1:3])  # [[2 3]
                         #  [5 6]]

実行結果:

1
3
[2 3 4]
5
[[2 3]
 [5 6]]

配列の形状とサイズ

shape属性で配列の形状を取得でき、size属性で配列の要素数を取得できます。

import numpy as np

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

print("Shape:", arr.shape)  # (5,)
print("Size:", arr.size)    # 5

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print("Shape:", matrix.shape)  # (3, 3)
print("Size:", matrix.size)    # 9

配列の生成関数

Numpyには便利な配列生成関数がいくつかあります。例えば、zeros()ones()arange()linspace()などです。

import numpy as np

zeros_arr = np.zeros(5)
print("Zeros:", zeros_arr)

ones_arr = np.ones(5)
print("Ones:", ones_arr)

arange_arr = np.arange(0, 10, 2)
print("Arange:", arange_arr)

linspace_arr = np.linspace(0, 1, 5)
print("Linspace:", linspace_arr)

配列の操作

Numpy配列は、reshape()transpose()などの操作を行うことができます。

import numpy as np

arr = np.arange(1, 10)

# 配列の形状を変更
reshaped_arr = arr.reshape(3, 3)
print("Reshaped array:\n", reshaped_arr)
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 配列の転置
transposed_matrix = matrix.T
print("Transposed matrix:\n", transposed_matrix)

実行結果:

Transposed matrix:
 [[1 4 7]
 [2 5 8]
 [3 6 9]]

配列の統計処理

Numpyでは、sum()mean()min()max()などの統計処理を簡単に行うことができます。

import numpy as np

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

# 配列要素の合計
print("Sum:", arr.sum())

# 配列要素の平均
print("Mean:", arr.mean())

# 配列要素の最小値
print("Min:", arr.min())

# 配列要素の最大値
print("Max:", arr.max())

実行結果:

Sum: 15
Mean: 3.0
Min: 1
Max: 5

これらは、Python初心者がNumpyを学ぶ際の基本的な概念と機能です。これらを理解し、実践することで、効率的な数値計算やデータ処理ができるようになります。

Matplotlibの概要

Matplotlibは、Pythonのデータ可視化ライブラリです。様々な種類のグラフやチャートを描画することができます。このライブラリは、NumPyやSciPyといった科学技術計算のためのPythonライブラリと相性が良いです。

Matplotlibの用途

Matplotlibは以下のような用途で使用されます。

  • データ分析
  • 機械学習モデルの評価
  • シミュレーション結果の可視化
  • リアルタイムでのデータのプロット

Matplotlibの実装

Matplotlibによるグラフの描画

Matplotlibを使って簡単な折れ線グラフを描画してみましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
x = np.linspace(0, 10, 100) # 0から10までの範囲を100等分したデータ
y = np.sin(x)               # xに対するsin関数の値を計算

# グラフの描画
plt.plot(x, y)              # 折れ線グラフをプロット
plt.xlabel("x")             # x軸のラベル
plt.ylabel("sin(x)")        # y軸のラベル
plt.title("Sin function")   # グラフのタイトル
plt.show()                  # グラフの表示

実行結果: sin関数のグラフが表示されます。

pyplot:タイトルやX軸ラベルの描画など

Matplotlibのpyplotは、グラフ描画のためのインターフェースです。様々な種類のグラフ(折れ線グラフ、棒グラフ、散布図など)を描画する関数が提供されています。また、軸ラベルや凡例、タイトルなどの設定も簡単に行うことができます。以下に、いくつかの重要な機能と使用例を示します。

  1. タイトルの描画
  2. X軸・Y軸ラベルの描画
  3. 凡例の描画
  4. グリッドの表示

以下に、これらの機能を組み合わせた実例を示します。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# グラフの描画
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")

# タイトルと軸ラベルの設定
plt.title("Sin and Cos functions")
plt.xlabel("x")
plt.ylabel("Function value")

# 凡例とグリッド線の表示
plt.legend()
plt.grid(True)

# グラフの表示
plt.show()

Matplotlibの画像の表示

フリーのサンプル画像として、scikit-imageライブラリに含まれるアストロナウトの画像を使用して、Matplotlibで画像を表示する方法を説明します。

import matplotlib.pyplot as plt
from skimage import data

# サンプル画像の読み込み
img = data.astronaut()

# 画像の表示
plt.imshow(img)
plt.axis('off')  # 軸を非表示にする
plt.show()       # グラフの表示

実行結果: scikit-imageのサンプル画像(アストロナウト)が表示されます。

subplot:複数のグラフを並べて表示する

subplotを使うことで、複数のグラフを1つのウィンドウに並べて表示できます。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 1行2列の1番目のプロット
plt.subplot(1, 2, 1)
plt.plot(x, y1)
plt.title("sin(x)")

# 1行2列の2番目のプロット
plt.subplot(1, 2, 2)
plt.plot(x, y2)
plt.title("cos(x)")

plt.tight_layout()  # グラフ間のスペースを調整
plt.show()

実行結果: sin(x)とcos(x)のグラフが1つのウィンドウに並べて表示されます。

Axes3D:3Dグラフの描画

Matplotlibでは3Dグラフも描画できます。Axes3Dを使って3Dプロットを作成し、3Dグラフを描画できます。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z)

plt.show()

実行結果: 3Dグラフが表示されます。

FuncAnimation:アニメーションの作成

MatplotlibのFuncAnimationを使ってアニメーションを作成し、結果を動画ファイル(.mp4)として保存する方法を示します。以下の例では、sin関数のアニメーションを作成し、"sin_animation.mp4"という名前の動画ファイルとして保存します。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
line, = ax.plot(x, y)

def update(num, x, y, line):
    line.set_ydata(np.sin(x + num / 100))
    return line,

ani = FuncAnimation(fig, update, frames=100, fargs=[x, y, line], blit=True)

# アニメーションを動画ファイルとして保存
ani.save("sin_animation.mp4", writer="ffmpeg", fps=30)

まとめ

最後までご覧いただきありがとうございました。