2017-08-30 14 views
0

2つのnp.matrixがありますが、そのうちの1つは正規化しようとしています。私は一般的に、リストの補完はforループよりも速いので、私はdouble forループをリスト式に変換しようとしています。np行列のリスト理解

A = np.asarray([A/(B[i-1]/B[j-1]) for i, j in zip(range(1,q+1), range(1,q+1))]) 

が、私は任意のかなりの時間差が表示されませんので、私は間違ったアプローチを取っていると思う:

# normalize the rows and columns of A by B 
for i in range(1,q+1): 
    for j in range(1,q+1): 
     A[i-1,j-1] = A[i-1,j-1]/(B[i-1]/B[j-1]) 

これは私がこれまでに得ているものです。

ご協力いただければ幸いです。

+0

なぜリストの補完はループよりも一般に速いと思いますか?あなたが実際にあなたの理解にforループを使用することを考えると、 – ForceBru

+2

本当に良いオプションがない限り、NumPy配列ではリスト内包*または* for forループを使用しないでください。 – user2357112

+0

思考リストの解説は通常、すべての反復でリストとその追加メソッドを検索する必要がないため、forループよりも少し速いです。 – Callahan

答えて

2

まず、np.matrixの場合は、np.matrixの使用を中止してください。それはあらゆる種類の厄介な非互換性を持ち、マトリックス乗算のための@が存在するので、その役割は時代遅れです。 @のないPythonバージョンで動かなくても、通常のndarraysでdotメソッドを使用すると、np.matrixを処理するよりも優れています。

より良いオプションがないと確信が持てない場合は、forループかリスト内包かどうかに関わらず、NumPy配列でPythonレベルの繰り返し構造を使用しないでください。 Aは、2DおよびBであると仮定すると、あなたの代わりにこのような場合のために何をすべきか、それぞれ形状(q, q)(q,)と1Dは、Aオーバー

A *= B 
A /= B[:, np.newaxis] 

broadcasting操作です。これにより、NumPyは、ラッパーオブジェクトを作成したり、すべての操作で動的ディスパッチを実行することなく、配列の基礎となるデータバッファ上で直接Cレベルで反復処理を実行できます。