NumPyで2つの行列を引き算することは、非常によく行われるタスクです。
NumPyで2つの行列を引く最も簡単な方法は -
演算子を使うことです。
これは np.subtract()
メソッド(行列のような配列や配列に似たものを引くために作られたNumPy特有のメソッド)の簡略版です。
Note: NumPyにおける配列のようなオブジェクトとは、 np.array()
メソッドに渡すことができ、 ndarray
型を持つオブジェクトを生成することができるオブジェクトのことを指します。
このガイドでは、NumPyで -
演算子と np.subtract()
メソッドの両方を使用して2つの行列を引く方法、どちらを使うべきか、そしてNumPyの np.subtract()
メソッドのすべてのニュアンスをより深く理解することができます。
NumPyで2つの行列を引き算する方法
代数学では、2つの行列は行と列の数が同じ、つまり同じ形である場合にのみ引き算が可能です。
同じ形の2つの行列があると仮定して、引き算をすることにしましょう。
matrix1 = np.array([[2, 4, 0], [9, 1, 7]])
matrix2 = np.array([[2, 2, 1], [3, 5, 8]])
注意: np.array()
メソッドのような NumPy のメソッドを初めて呼び出す前に、プロジェクトで import numpy as np
として NumPy モジュールをインポートする必要があります。
ご覧の通り、2つの行列は同じ形をしています。
つまり、 matrix1.shape
と matrix2.shape
は等しく、どちらも (2, 3)
に等しいということです。
この事実は非常に重要です。
なぜなら、 -
演算子と np.subtract()
メソッドの両方が、そうでない場合は期待通りの動作をしなくなるからです。
注意: 任意の ndarray
オブジェクト(配列または行列)の shape
プロパティには、そのオブジェクトの形状が (m, n)
という形式で格納されます(ここで m
は行列の行数、 n
は列数)。
ここで、 -
演算子を用いて、この 2 つの行列を引き算することができます。
resultMatrix = matrix1 - matrix2
という簡単なものです。
この行は次の行と等しくなります。
resultMatrix = np.subtract(matrix1, matrix2)
どちらの場合も、 resultMatrix
は予想通りまったく同じ値になります。
[ 0 2 -1]
[ 6 -4 -1]
NumPyで異なる形状の2つの行列を引き算する。
前のセクションでは、NumPy で減算を使用する最も直感的な方法を説明しました。
代数のルールでは、2つの行列が同じ形である場合にのみ引き算ができるとされています。
したがって、前のセクションでは、数学的に有効な唯一のタイプの行列の引き算を説明しました。
しかし、NumPyライブラリは、 np.subtract()
メソッドが、引数の行列が同じ形でない場合でも動作するようにすることができます。
これは、NumPyが算術演算中に異なる形状の配列をどのように扱うかを定義するブロードキャストと呼ばれる機構の助けを借りて実現されています。
最終的に、それらは形状が等しくなり、通常の減算が行われます。
例えば、次の2つの行列を見てみましょう。
rowMatrix = np.array([1, 2, 3])
columnMatrix = np.array([[1], [2], [3]])
これらの行列は、 rowMatrix.shape
は (1, 3)
であり、 columnMatrix.shape
は (3, 1)
であり、確かに異なる形状を持っています。
このため、NumPy ではこれらの行列の減算はできないと誤解されるかもしれませんが、それは間違いなく可能です(間接的にではありますが、減算の前に自動的にブロードキャストされるため)。
resultMatrix = np.subtract(rowMatrix, columnMatrix)
注意: np.subtract()
メソッドの代わりに -
演算子を使用した場合、 resultMatrix
は全く同じ値になります。
このとき、resultMatrix
は次のような値になります。
[ 0 1 2]
[-1 0 1]
[-2 -1 0]
この結果は少し直感に反しているように見えますが、ブロードキャストのメカニズムを簡単に説明するために使用してみましょう。
NumPy Broadcasting とは何ですか?
rowMatrixから
columnMatrixを引くには、両者が同じ形状でなければなりません。
この2つの行列は前述の基準を満たさないため、ブロードキャスティングメカニズムが登場する。
これは、両方の行列が互換性のある形状になるようにストレッチします。
したがって、rowMatrixは
(3, 3)` 形の行列を形成するように伸張されます。
> Original `resultMatrix`:
[1 2 3]
> Broadcasted `resultMatrix`:
[1 2 3]
[1 2 3]
[1 2 3]
同様に、 columnMatrix
は (3, 3)
の行列を形成するようにストレッチングされます。
> Original `resultMatrix`:
[1]
[2]
[3]
> Broadcasted `resultMatrix`:
[1 1 1]
[2 2 2]
[3 3 3]
これで,同じ形状の 2 つの変更された行列ができたので,引き算を実行することができます.結果として得られる行列は、上の例の resultMatrix
と同じものになります。
[1 2 3] [1 1 1] [ 0 1 2]
[1 2 3] - [2 2 2] = [-1 0 1]
[1 2 3] [3 3 3] [-2 -1 0]
注意:ブロードキャストはここで説明したよりもはるかに複雑なメカニズムなので、注意して使用するか、このトピックについてさらに調査することを強くお勧めします。
例えば、2つのマトリックスシェイプの他の組み合わせは ValueError
を発生させます。
W
結論
NumPyを使って2つの行列を簡単に引く方法を探していた人も、np.subtract()
メソッドに関するより高度な概念を思い出そうとしていた人も、このガイドで解決することができます。
このガイドの主なポイントは、これらの質問に対する答えを提供することです。
まず、NumPyモジュールで2つの行列を引くための簡単で直感的な方法を説明しました。
それと共に、-
演算子と np.subtract()
メソッドの類似点と相違点を説明しました。
その後、NumPyにおけるブロードキャストの概念を説明しましたが、ブロードキャストについてはより深く掘り下げることをお勧めします。
最後に、NumPyの np.subtract()
メソッドの詳細な概要を説明しましたので、そのデフォルトの動作を調整し、より特定のユースケースに適したものにすることができます。
</ufunc