ブロードキャストとベクトル化演算
ブロードキャストの仕組み、要素単位の演算、ベクトル化によるループ回避を学びます。
「ブロードキャストとベクトル化演算」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 配列の作成とプロパティ
- インデックス参照、スライス、ファンシーインデックス
- ブロードキャストとベクトル化演算
- NumPy による線形代数