Pythonでのベクトル化とブロードキャスト
公開: 2020-12-01ベクトル化とブロードキャストは、Numpyで数学演算を実行しながら、計算時間を短縮し、メモリ使用量を最適化する方法です。 これらの方法は、アルゴリズムがボトルネックに直面しないように、時間の複雑さを軽減するために重要です。 この最適化された操作は、アプリケーションをスケーラブルにするために必要です。 これらの両方の手法を確認し、いくつかの例を実装します。
このチュートリアルを終了するまでに、次の知識が身に付きます。
- Numpyによるベクトル化の処理方法
- ベクトル化の有無による時差
- 放送とは
- ブロードキャストと通常の行列乗算との違い
ベクトル化
多くの場合、配列の乗算など、配列に対する数学演算が必要です。 ここで、ベクトル化されていない方法は、ループを使用して要素ごとの乗算を行うことです。 このように実装すると、同じ乗算演算が複数回実行されることになり、データサイズが大きすぎると、コンピューティングリソースが無駄になります。 簡単に見てみましょう。
ベクトル化されていない方法:
ランダムにインポート a = [random.randint( 1、100 ) for _ in range ( 10000 ) ] |
#出力: >> 1000ループ、ベスト3 :ループあたり658 µs |
ベクトル化された方法:
numpyをnpとしてインポートします a = np.array([random.randint(1、100 ) for _ in range ( 10000 ) ] ) b = np.array([random.randint(1、100 ) for _ in range ( 10000 ) ] ) %timeit a * b |
#出力: >> 100000ループ、ベスト3 :ループあたり7.25 µs |
ご覧のとおり、経過時間は658マイクロ秒からわずか7.25マイクロ秒になりました。 これは、 a = np.array([])と言うと、すべての操作がnumpyによって内部的に処理されるためです。 そして、 a * bを実行すると、numpyは、ベクトル化によって配列全体を一度に内部的に乗算します。
ここでは、%timeit magicコマンドを使用して、マシンによって異なる可能性のあるプロセスの実行時間を計測します。
次元(nx1)と(1xm)を持つ2つのベクトルの外積の別の例を見てみましょう。 出力は(nxm)になります。
インポート時間 numpyをインポートする 配列をインポート a = array.array( 'i' 、 [random.randint(1、100 ) for _ in range ( 100 ) ]) b = array.array( 'i' 、 [random.randint(1、100 ) for _ in range ( 100 ) ]) |
T1 = time.process_time() c = numpy.zeros (( 200、200 ) ) 範囲内のiの場合(len(a)): 範囲内のjの場合(len(b)): c [i] [j] = a [i] * b [j] T2 = time.process_time() print( f”計算時間= { 1000 *(T2-T1)} ms” ) |
#出力: >>計算時間= 6.819299000000001ミリ秒 |
それでは、Numpyでやってみましょう。
T1 = time.process_time() c = numpy.outer(a、b) T2 = time.process_time() print( f”計算時間= { 1000 *(T2-T1)} ms” ) |
#出力: >>計算時間= 0.2256630000001536ミリ秒 |
もう一度見るように、Numpyはベクトル化によって同じ操作をより速く処理します。
必読:実世界での魅力的なPythonアプリケーション
これまで、同じサイズの配列が使用された例を見てきました。 配列のサイズが異なる場合はどうなりますか? ここで、Numpyのもう1つの優れた機能であるBroadcastingが登場します。
ブロードキャストは、ベクトル化のもう1つの拡張機能であり、加算、減算、乗算などの操作を実行するために配列を同じサイズにする必要はありません。配列とスカラーの加算の非常に簡単な例でこれを理解しましょう。

a = np.array ( [ 1、1、1、1 ] ) _ a + 5 |
#出力: array ( [ 6、6、6、6 ] ) _ _ _ |
ご覧のとおり、スカラー5がすべての要素に追加されました。 それで、それはどのように起こりましたか?
プロセスを想像すると、スカラー5が4回繰り返されて配列が作成され、それが配列aに追加されると考えることができます。 ただし、Numpyは、メモリのみを使用するような配列を作成しないことに注意してください。 Numpyは、スカラーを5から4まで「ブロードキャスト」または複製して、配列aに追加します。
別の簡単な例を見てみましょう。
a = np.ones(( 3、3 ) ) b = np.ones( 3 ) a + b |
#出力: >> array([[ 2. 、 2。 、 2。 ]、 [ 2. 、 2。 、 2。 ]、 [ 2. 、 2。 、 2。 ]]) |
上記の例では、形状(3,1)の配列が(3,3)にブロードキャストされ、配列aと一致します。
しかし、これは、任意の次元の配列をブロードキャストして、任意の次元の配列と一致させることができることを意味しますか?
いいえ!
放送ルール
Numpyは一連の簡単なルールに従って、基準に従ったアレイのみがブロードキャストされるようにします。 見てみましょう。
ブロードキャストのルールでは、操作する2つのアレイは同じ寸法であるか、どちらかが1である必要があります。
これが実際に動作しているのを見てみましょう。
例1:
以下の次元の配列を検討してください。
a = 3 x 4 x 7
b = 3 x 4 x 1
ここで、bの最後の次元はaから7の次元と一致するようにブロードキャストされます。
したがって、結果= 3 x 4 x 7
例2:
a = 3 x 4 x 7
b = 4
現在、aとbの次元数は等しくありません。 このような場合、次元数が少ない配列には1が埋め込まれます。
したがって、ここでは、bの最初と最後の次元は1であるため、aから3および7の次元と一致するようにブロードキャストされます。
したがって、結果= 3 x 4x7です。
読む: Pythonチュートリアル
例3:
a = 3 x 4 x 1 x 5
b = 3 x 1 x 7 x 1
ここでも、bの2番目と最後の次元がaから4および5の次元と一致するようにブロードキャストされます。また、aの3番目の次元がbから7の次元と一致するようにブロードキャストされます。
したがって、結果= 3 x 4 x 7 x 5
次に、条件がいつ失敗するかを見てみましょう。
例4:
a = 3 x 4 x 7 x 5
b = 3 x 3 x 7 x 4
ここで、bの2番目と4番目の次元はaと一致せず、どちらも1ではありません。この場合、Pythonは値エラーをスローします。
ValueError :オペランドを図形( 3、4、7、5 ) ( 3、3、7、4 )と一緒にブロードキャストできませんでした_ |
例5:
a = 3 x 4 x 1 x 5
b = 3 x 2 x 3
結果: ValueError
ここでも、2番目の次元は一致せず、どちらも1ではありません。
行く前に
ベクトル化とブロードキャストはどちらも、Numpyが処理を最適化してより効率的にする方法です。 これらの概念は、特に画像データやニューラルネットワークで非常に一般的な行列やn次元配列を扱う場合に留意する必要があります。
python、データサイエンスについて知りたい場合は、IIIT-BとupGradのデータサイエンスのPGディプロマをチェックしてください。これは、働く専門家向けに作成され、10以上のケーススタディとプロジェクト、実践的なハンズオンワークショップ、業界の専門家とのメンターシップを提供します。業界のメンターとの1対1、400時間以上の学習、トップ企業との就職支援。
Pythonのベクトル化とは何ですか?
NumpyはPythonパッケージであり、ベクトル化などのループを必要とせずに、データの大規模な配列で迅速な操作を可能にするいくつかの標準的な数学関数を提供します。 ベクトル化は、ループを使用せずにPythonプログラムを高速化するために使用されます。 このような方法を使用すると、コードの実行にかかる時間を短縮できます。 ベクトルの内積など、ベクトルに対して実行されるさまざまな操作があります。これは、単一の出力である外積を生成するため、スカラー積とも呼ばれます。これにより、長さx長さに等しい次元の正方行列が生成されます。ベクトル、要素ごとの乗算。同じインデックスを持つ要素を生成します。
Pythonでのブロードキャストとは何ですか?
ブロードキャストという言葉は、Numpyが算術演算中に異なる次元の配列を管理する方法を指し、特定の制限が発生します。 小さい方のアレイは、フォームが一貫するように、巨大なアレイ全体にブロードキャストされます。 ブロードキャストを使用すると、Numpyのように、PythonではなくCでループが発生するように配列操作をベクトル化できます。 データの不要なコピーを作成することなくこれを実現し、効率的なアルゴリズムの実装を実現します。 特定の状況では、ブロードキャストは無駄なメモリ消費をもたらし、処理を遅くするため、否定的な考えです。
PythonでのNumPyの用途は何ですか?
NumPyまたはNumericalPythonは、ほぼすべての研究およびエンジニアリング部門で利用されている無料のオープンソースPythonライブラリです。 NumPyライブラリには、多次元配列および行列データ構造が含まれており、同種のn次元配列オブジェクトである配列を効率的に操作するためのメソッドを提供します。 ユーザーはNumPyを使用して、配列に対してさまざまな数学演算を実行できます。 配列と行列を使用した効率的な計算を提供する強力なデータ構造と、これらの配列と行列を処理する高レベルの数学関数の大規模なライブラリを使用して、Pythonを強化します。