0Pricing
Learn AI with Python · レッスン

ブロードキャストとベクトル化演算

ブロードキャストの仕組み、要素単位の演算、ベクトル化によるループ回避を学びます。

「ブロードキャストとベクトル化演算」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。

ベクトル化する理由

NumPyは、Cの速度で配列全体を処理します。Pythonのループを配列式に置き換えるベクトル化は、多くの場合10倍から100倍高速です。

要素単位の演算

形状が一致している場合、算術演算子は要素ごとに適用されます。ループは必要ありません。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b)   # [11 22 33]
print(a * b)   # [10 40 90]

スカラーのブロードキャスト

配列とスカラーの演算では、スカラーがすべての要素に適用されます。スカラーが配列全体に「broadcast」される、と表現します。

a = np.array([1, 2, 3, 4])
print(a * 10)   # [10 20 30 40]
print(a + 100)  # [101 102 103 104]

ブロードキャストとは

ブロードキャストを使うと、NumPyは小さい配列をメモリコピーなしで仮想的に引き伸ばし、形状の異なる配列を組み合わせられます。

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

形状は末尾(右端)の次元から比較します。2つの次元は、サイズが等しいか、どちらか一方が1の場合に互換性があります。サイズ1の次元は、もう一方に合うように拡張されます。

# (3, 4) with (4,)   -> compatible (trailing 4 matches)
# (3, 4) with (3, 1)  -> compatible (1 stretches to 4)
# (3, 4) with (3,)    -> ERROR (trailing 4 vs 3)

行ベクトルのブロードキャスト

列数と同じ長さの1次元配列を加算すると、すべての行に加算されます。

m = np.array([[1, 2, 3], [4, 5, 6]])
row = np.array([10, 20, 30])
print(m + row)
# [[11 22 33]
#  [14 25 36]]

列ベクトルのブロードキャスト

ベクトルを列ベクトル(shape (n,1))にreshapeすると、行方向ではなく列方向にブロードキャストされます。

col = np.array([[100], [200]])   # shape (2, 1)
print(m + col)
# [[101 102 103]
#  [204 205 206]]

データの中心化(実用例)

列ごとの平均を引くと各特徴量が中心化されます。これは、ブロードキャストを使った1行の処理で実行できる一般的な前処理です。

data = np.array([[1.0, 10.0], [2.0, 20.0], [3.0, 30.0]])
centered = data - data.mean(axis=0)
print(centered)
# columns now have mean 0

ユニバーサル関数(ufunc)

NumPyには、ufuncsと呼ばれる高速な要素単位の数学関数が用意されています。np.sqrt、np.log、np.expなどがあり、ベクトル化とブロードキャストに対応しています。

a = np.array([1.0, 4.0, 9.0, 16.0])
print(np.sqrt(a))   # [1. 2. 3. 4.]
print(np.log(a))    # natural log of each element
print(np.exp([0, 1]))  # [1.        2.71828183]

ループとベクトル化の速度比較

同じ計算でも、ベクトル化すると大幅に高速になります。100万要素を対象に%timeitを使って、その違いを体感してみましょう。

big = np.arange(1000000, dtype=float)
# Slow Python loop:
# %timeit [x*x for x in big]
# Fast vectorized:
%timeit big * big   # typically tens of times faster

ベクトル化の組み合わせ

ufuncと算術演算を連結して、数式をそのまま表現できます。これにより、ループなしでガウス曲線を計算できます。

x = np.linspace(-3, 3, 7)
y = np.exp(-x**2 / 2)
print(np.round(y, 3))

確認問題

ブロードキャストの理解度を確認しましょう。

まとめ

ベクトル化の要点:

  • 要素単位の演算はPythonのループを不要にし、Cの速度で実行される
  • ブロードキャストは末尾の次元をそろえる。サイズは一致するか、1でなければならない
  • 列方向にブロードキャストするには列ベクトル(n,1)を使う
  • ufunc:np.sqrt、np.log、np.exp
  • data - data.mean(axis=0)でデータを中心化する

よくある質問

「ブロードキャストとベクトル化演算」レッスンは無料ですか?

はい。「ブロードキャストとベクトル化演算」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。

「ブロードキャストとベクトル化演算」で何を学びますか?

ブロードキャストの仕組み、要素単位の演算、ベクトル化によるループ回避を学びます。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn AI with Pythonを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ブロードキャストとベクトル化演算」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn AI with Pythonレッスンでコードを書いて実行できますか?

はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 配列の作成とプロパティ
  2. インデックス参照、スライス、ファンシーインデックス
  3. ブロードキャストとベクトル化演算
  4. NumPy による線形代数
← Learn AI with Pythonに戻る