ブロードキャスティング
メニューを表示するにはスワイプしてください
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つを試してチャットを始めてください