ブロードキャスティング
メニューを表示するにはスワイプしてください
NumPyで数学的な操作を行う前に、重要な概念であるブロードキャスティングを理解することが大切です。
ブロードキャスティングは、配列の形状を手動で変更することなく、算術演算を行うために配列の形状を揃える方法です。基本的に、ブロードキャスティングは配列の形状を自動的に調整します。
NumPyが2つの配列を扱う際、それらが一緒にブロードキャストできるかどうかを判断するために、配列の形状の互換性を確認します。
2つの配列がすでに同じ形状である場合、ブロードキャストは不要。
同じ次元数
加算を行いたい2つの配列があり、それぞれの形状が (2, 3) と (1, 3) であるとする。NumPyは2つの配列の形状を右端の次元から左方向に比較する。つまり、最初に3と3を比較し、次に2と1を比較する。
2つの次元は、等しい場合、またはどちらか一方が1の場合に互換性があるとみなされる。
- 3と3の次元は、等しいため互換性あり。
- 2と1の次元は、どちらかが1のため互換性あり。
すべての次元が互換性を持つため、形状は互換性ありと判断される。したがって、配列はブロードキャスト可能となり、同じ形状の行列間での標準的な加算演算(要素ごとの演算)が実行される。
123456789import numpy as np array_1 = np.array([[1, 2, 3], [4, 5, 6]]) print(array_1.shape) # Creating a 2D array with 1 row array_2 = np.array([[11, 12, 13]]) print(array_2.shape) # Broadcasting and element-wise addition result = array_1 + array_2 print(result)
array_2 は、1 行のみを含む 2 次元 配列として作成されているため、その形状は (1, 3) となる。
しかし、これを形状 (3,) の 1 次元 配列として作成した場合はどうなるか?
次元数の違い
一方の配列の次元数が他方より少ない場合、足りない次元 は 1 のサイズとして扱われる。例えば、形状が (2, 3) と (3,) の 2 つの配列を考える。この場合、3 = 3 であり、左側の足りない次元は 1 と見なされるため、形状 (3,) は (1, 3) となる。形状 (2, 3) と (1, 3) は互換性があるため、これら 2 つの配列はブロードキャスト可能となる。
123456789import numpy as np array_1 = np.array([[1, 2, 3], [4, 5, 6]]) print(array_1.shape) # Creating a 1D array array_2 = np.array([11, 12, 13]) print(array_2.shape) # Broadcasting and element-wise addition result = array_1 + array_2 print(result)
スカラーのブロードキャスト
配列同士の数学演算に加えて、スカラー(数値)と配列の間でも、ブロードキャストによって同様の演算が可能。スカラーは本質的に形状を持たず、すべての次元が1と見なされるため、配列の形状が任意でも常に互換性がある。
123456import numpy as np array = np.array([[1, 2, 3], [4, 5, 6]]) print(array.shape) # Broadcasting and element-wise addition result = array + 10 print(result)
非互換な形状
非互換な形状の例も考えてみます。この場合、ブロードキャストが不可能なため、算術演算を実行できません:
2x3 配列と長さが 2 の 1 次元配列、すなわち形状が (2,) の配列があります。欠落している次元は 1 と見なされるため、形状は (2, 3) と (1, 2) になります。
左から右へ見ていくと、3 != 2 となり、すぐに非互換な次元、したがって非互換な形状となります。この状態でコードを実行しようとすると、エラーが発生します:
12345678import numpy as np array_1 = np.array([[1, 2, 3], [4, 5, 6]]) print(array_1.shape) array_2 = np.array([11, 12]) print(array_2.shape) # ValueError result = array_1 + array_2 print(result)
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください