レッスン1 / 1問目

『ブロードキャスト』

このレッスンではNumPy配列におけるブロードキャストという機能を学習します。

本レッスンではブロードキャストについて以下3つの内容を見ていきます。

  1. ブロードキャストとは
  2. 二次元配列におけるブロードキャスト
  3. ブロードキャストのルール

ではこれらについて順番に見ていきましょう。

ブロードキャストとは

ブロードキャストとは配列同士の演算において要素数が一致しない場合に、自動で行や列を拡張してくれる機能のことを指します。

例えば以下のようなベクトル演算でもブロードキャストが行われています。

  1. arr1 = np.array([1, 2, 3])
  2. arr2 = arr1 + 10    # ブロードキャスト
  3. print(arr2)

このコードにおいてブロードキャストが行われているのは3行目下線が引いてある箇所のコードです。ここでは配列arr1と10を加算する演算を行っていますが、配列arr1は要素数が3であるのに対して10は要素数が1です。

実はこの演算ではブロードキャストによって10を[10 10 10]のような配列に拡張しています。イメージとしては以下のようになります。これにより要素数が異なるにも関わらず演算を行うことができます。

  1. np.array([1, 2, 3]) + np.array([10, 10, 10])    # イメージ

このように要素を自動で拡張してくれる仕組みがブロードキャストです。

二次元配列におけるブロードキャスト

では次は二次元配列におけるブロードキャストを見ていきましょう。

以下は一次元配列(arr2)と二次元配列(arr1)で演算を行う例です。

  1. arr1 = np.array([[1, 2, 3],
  2.        [4, 5, 6]])
  3. arr2 = np.array([10, 20, 30])
  4. print(arr1 + arr2)
[[11 22 33] [14 25 36]]    # arr2が二次元にブロードキャストされている

上記の例題では一次元の配列と二次元の配列が演算されていますが、ブロードキャストの機能によりarr2が二次元配列に拡張されて演算されています。arr2の拡張のイメージは以下の通りです。

  1. arr2 = np.array([[10, 20, 30],)    # イメージ
  2.         [10, 20, 30]]

ブロードキャストのルール

ではここからはブロードキャストのルールについて見ていきましょう。ブロードキャストには以下のルールがあります。

形状が一致しなかった配列の行数、または列数が1の場合にのみブロードキャストが行われる。

ではこのルールについて理解するためにブロードキャストが可能な例とエラーとなる例をいくつか見ていきましょう。

以下の2つの配列は演算が可能な場合の例です。

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

上記の例では配列arr1が1行3列、arr2が2行3列であるため行数が一致していませんが、ブロードキャストのルールのとおり、要素数が足りなかった側(arr1)の行数が1であるため、ブロードキャストにより2行3列に拡張され演算が可能となります。

次の例は演算を行うことができない例です。(エラーとなる例)

  1. arr1 = np.array([1, 2])    # 1行2列
  2. arr2 = np.array([[1, 2, 3])    # 1行3列

上記の例ではarr1が1行2列であるのに対し、arr2が1行3列であるため列数が一致しません。さらに、要素数が不足している側(arr1)の列数が1ではないため、上記ブロードキャストのルールのとおり拡張することができません。

では最後にもう一つ例題を見ていきましょう。
ここでは以下の2つの配列が、ブロードキャスト可能かどうか少し考えてみてください。
arr1が「1行3列」、arr2が「2行1列」の配列となります。

  1. arr1 = np.array([1, 2, 3])    # 1行3列
  2. arr2 = np.array([[1],    # 2行1列
  3.         [2]])

これらは行、列ともに形状が一致していませんが、それぞれ要素数が不足している側の行数、列数が1であるためブロードキャストが可能となります。
上記を演算すると以下のように行、列ともに拡張されて演算されます。

  1. print(arr1 + arr2)
[[2 3 4] [3 4 5]]

このように演算を行う二つの配列の形状が不一致である場合は、それぞれ行数・列数が不足している側の行数・列数が1であればブロードキャストが可能となります。

まとめ

このレッスンではブロードキャストの概要とルールについて学習しました。
重要な点を以下にまとめます。

  • ブロードキャストとは「要素数が一致しない場合に、自動で行や列を拡張してくれる機能」である
  • 要素数が不足してる側の配列の「行数または列数が1の場合」に限りブロードキャストが行われる。

ちなみにブロードキャストに関して「拡張」という表現をしていますが、実際に拡張した分のメモリが割り当てられているわけではなく、あくまで概念として拡張されているという意味ですので注意してください。

では練習問題にチャレンジしましょう。

Lesson1

arr1に対して演算を行い以下の配列を出力してください。

[[21 22 23] [24 25 26]]

Lesson2

arr1に対して演算を行い以下の配列を出力してください。

[[11 22 33] [14 25 36]]

Last updated:2019/11/2

[[21 22 23]
 [24 25 26]]
[[11 22 33]
 [14 25 36]]
  1. import numpy as np

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

  4. # 1. 指定した配列を出力してください

  5. print(arr1 + 20)

  6. # 2. 指定した配列を出力してください

  7. arr2 = np.array([10, 20, 30])
  8. print(arr1 + arr2)
main.py
設定
g
n
i
d
a
o
L