このブログではデータサイエンスに関わる情報を発信しています。
今回はnumpyの使い方2回目という事で、行列の演算とブロードキャストについて解説します。
データサイエンスで必須の部分です。
前回のがまだという人は↓からどうぞ!
【python】Numpyの使い方講座①:ndarrayを生成してみよう!
この講座では全てサンプルコードを記載してあります。
各々のpythonの環境で実際に手を動かしながら読み進める事を推奨しています。
サクッとやりたい方は、google colaboratoryが簡単でおすすめです。
numpyを使って行列の演算
行列の演算は、線形代数の基礎的な概念であり、多くの科学技術分野において必要不可欠な機能です。
行列の演算には以下の物があります。
- 加算
- 減算
- スカラー倍
- 積
- 転置
- 逆行列
行列の加算と減算
2つの行列の要素ごとの加算と減算は、同じ位置にある要素を足し合わせたり引いたりするだけです。行列の形状は同じでなければなりません。
コードも非常にシンプルです。
さっそく、行列aとbを作成してそれぞれを加算・減算してみましょう。
1 2 3 4 5 |
import numpy as np # 2つの行列を作成 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) |
まずはaとbを作りました。
それぞれを演算してみましょう。
1 2 3 4 5 6 7 8 9 |
# 加算 c = a + b print(c) # [[ 6 8] # [10 12]] # 減算 d = a - b print(d) # [[-4 -4] # [-4 -4]] |
加算の結果
[[ 6 8]
[10 12]]
減算の結果
[[ -4 -4]
[-4 -4]]
無事結果が表示されました。
それぞれの要素を足し算、引き算するだけなので簡単ですね。
行列のスカラー倍
行列の各要素にスカラー値を乗算することをスカラー倍といいます。
ちなみに行列ではスカラーとベクトルという言葉が良く出てきます。
スカラーとベクトルとは?
スカラーは、数値を単一の値として表現する数学用語です。
つまり、スカラーは大きさだけを持ち、方向を持たない量です。
例えば、温度、体積、質量などがスカラーの例です。
一方、ベクトルは、大きさと向きを持つ量を表すもので、矢印で表現されます。
一次元のベクトルは数直線上で、二次元のベクトルは平面上で、三次元のベクトルは空間上で表現されます。

こういうやつです。
昔に習った人も多いと思います。
スカラー倍をnumpyで計算すると以下のようになります。
1 2 3 4 5 6 7 |
# 行列を作成 a = np.array([[1, 2], [3, 4]]) # スカラー倍 b = 2 * a print(b) # [[2 4] # [6 8]] |
このように、全ての要素を2倍した結果が返ってきました。
行列の積
行列の積のやり方を覚えていますか?ちょっと難しいですよね?
行列の積は、1つ目の行列の行と2つ目の行列の列をそれぞれ要素ごとに掛け算して足し合わせたものを、新たな行列の要素とすることで得られます。
numpyですとdot()を使い、掛け合わせたい行列を指定する事で計算できます。
1 2 3 4 5 6 7 8 |
# 2つの行列を作成 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 行列の積 c = np.dot(a, b) print(c) # [[19 22] # [43 50]] |
[[19 22]
[43 50]]
行列の転置
NumPyにおける転置とは、多次元配列の軸の順序を反転させる操作のことを指します。例えば、行列を転置すると、行と列が入れ替わります。
\begin{pmatrix}
1 & 2\\
3 & 4\\
\end{pmatrix}
これを転置させると以下のものになります。
\begin{pmatrix}
1 & 3\\
2 & 4\\
\end{pmatrix}
行列が入れ替わり、2,3の位置が変わりましたね。
転置を実行するには、transpose()
関数またはT
属性を使用します。たとえば、以下のように行列を定義して、転置を実行することができます。
1 2 3 4 5 6 7 |
arr = np.array([[1, 2, 3], [4, 5, 6]]) arr_transpose = arr.transpose() print("Original Array:") print(arr) print("Transposed Array:") print(arr_transpose) |
このコードでは、arr
という2×3の行列を定義し、transpose()
関数を使用して行列を転置しました。
また、T
属性を使用することもできます。以下は同じ結果を得るためのT
属性を使用したコードです。
1 2 |
arr_transpose = arr.T print(arr_transpose) |
numpyのブロードキャスト
NumPyのブロードキャストとは、異なる形状の配列間で自動的に演算を行う仕組みのことです。ブロードキャストにより、配列のサイズを合わせるための余分なコードを書かなくても、配列の演算を効率的に行うことができます。
簡単に言うと、以下のような形の違う行列同士をうまいこと補完して計算してくれるのです。
\begin{pmatrix}
1 & 2 & 3\\
\end{pmatrix}
\begin{pmatrix}
1 \\
2 \\
3 \\
\end{pmatrix}
ブロードキャストを実際にみてみよう
では実際に、上記の様な1行3列と3行1列の行列の加算をみてみましょう。
以下のコードで行う事ができます。
1 2 3 4 5 6 7 |
# 2つの異なる形状の配列を作成する a = np.array([1, 2, 3]) b = np.array([[1], [2], [3]]) # 配列aと配列bの要素単位の足し算を行う print(a + b) |
このようにブロードキャスト機能を使うと、形状がことなる行列同士でも計算する事ができるのです。
ブロードキャストの適用条件
注意して欲しい点として、どんな行列同士でも演算が出来るというわけではなく、条件があります。条件に合わないものはエラーになってしまいます。
条件としては、以下の物があります。
- 2つの配列の次元数が異なる場合、次元数が大きい方に対して次元を追加して形状を整える。
- 2つの配列の形状が異なる場合、形状が1の次元を自動的に拡張して形状を整える。
- 2つの配列の形状が異なり、どちらかの形状が1次元でない場合はエラーとなる。
ブロードキャストの利用シーン
NumPyのブロードキャストは、様々な場面で使われます。以下にいくつかの例を挙げます。
- 機械学習:機械学習アルゴリズムでは、データセットをバッチごとに処理することが一般的です。これは、大量のデータを扱う場合に、メモリの制約や計算時間の面で効果的です。ブロードキャストを使用することで、バッチごとにデータを効率的に処理することができます。
- グラフィックス:グラフィックスや画像処理では、RGB画像をR、G、Bのチャンネルごとに分解します。ブロードキャストを使用することで、RGB画像を簡単に分解することができます。
- 数値計算:数値計算では、多次元配列の演算が必要となる場合があります。例えば、微分方程式の数値解法やフーリエ変換などがあります。ブロードキャストを使用することで、高速かつ効率的な数値計算を行うことができます。
まとめ
いかがでしたでしょうか?
まとめると、行列の演算では以下の物を学びました。
- 加算
- 減算
- スカラー倍
- 積
- 転置
- 逆行列
またブロードキャスト機能を使う事で、異なる形状の配列間でも自動的に演算を行う事ができます。
numpyの演算はデータサイエンスでは必ず使いますので、しっかりと覚えましょう!
Work illustrations by Storyset