2017-12-11 9 views
-6

Python 3でループをベクトル化するのはどういう意味ですか? Python 3でネストされたforループを書く別の方法はありますか?ベクトル化とは何ですか?

私はPythonには新しく、私の研究ではいつもNumPyライブラリがあります。誰かが私を助けることを願っています。

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[最小限で完全で検証可能なサンプルの作成方法](https://stackoverflow.com/help/mcve) – Billa

+0

もしあなたがPythonに慣れていないなら、Numpyのような高度なサードパーティ製のフレームワークに移行する前に、プレーンなPython(そしてその標準ライブラリ)を習得することをお勧めします。もちろん、大規模なデータ配列に対して数値処理を行う必要がある場合は、Numpyも学習する必要がありますが、Pythonの動作に慣れた方がはるかに簡単です。 FWIWは、標準ライブラリの 'itertools.product'は、特定のタイプのネストされたループを管理するうえで便利ですが、確かにNumpyほど高速ではありません。 –

答えて

2

Python forループは本質的にCのものよりも遅いです。

これは、numpynumpyアレイでベクトル化された処理を行う理由です。 Pythonで普通に行うforループをCレベルにプッシュします。これははるかに高速です。 numpyは、ベクトル化(「Cレベルforループ」)そうでない場合は、要素ごとの方法(「Pythonのレベルforループ)で行われる必要があるものに代わるものを提供しています。

import numpy as np 
from timeit import Timer 

li = list(range(500000)) 
nump_arr = np.array(li) 

def python_for(): 
    return [num + 1 for num in li] 

def numpy_add(): 
    return nump_arr + 1 

print(min(Timer(python_for).repeat(10, 10))) 
print(min(Timer(numpy_add).repeat(10, 10))) 

# 0.725692612368003 
# 0.010465986942008954 

numpyベクトル化されたほかは、より高速なX70の倍でした。

0

ここでウェス・マッキニーからdefinitionです:彼らはいずれかを記述することなく、データのバッチ 操作を表現することができますので、

配列が重要ですforループ。これは通常ベクトル化と呼ばれる です。等しいサイズの 配列の間の算術演算は、演算を要素ごとに適用します。

ベクトル化バージョン:

>>> import numpy as np 
>>> arr = np.array([[1., 2., 3.], [4., 5., 6.]]) 
>>> arr * arr 
array([[ 1., 4., 9.], 
     [ 16., 25., 36.]]) 

ネイティブのPython(ネスト)リスト上のループと同じこと:これら二つの操作を比較するにはどうすればよい

>>> arr = arr.tolist() 
>>> res = [[0., 0., 0.], [0., 0., 0.]] 
>>> for idx1, row in enumerate(arr): 
     for idx2, val2 in enumerate(row): 
      res[idx1][idx2] = val2 * val2 
>>> res 
[[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]] 

? NumPyのバージョンは436 nsです。 Pythonのバージョンは3.52μs(3520 ns)です。この「小さな」時間の大きな違いは、マイクロパフォーマンスと呼ばれ、大規模なデータや繰り返し操作を数千から数百万回実行する場合に重要になります。

関連する問題