2017-06-24 9 views
1

行列形式を使って式内のループをforに変換する必要があります。'for'ループを行列式に変換しますか?

マトリックスC

array([[0, 1, 1], 
      [1, 0, 0], 
      [1, 0, 0]]) 

ベクターdelta_E

array([ 4., 2., 4., 1.]) 

ACの寸法がゼロの行列であり、長さ3のベクトルE Iは行列Cを有します、およびindicesのリスト:

indices = [1, 1, 0, 1] 

私はのためのCの列インデックスが見つかりました:

i0, i1 = np.where(C[indices] == 1) 

は、彼らは以下のとおりです。

i0 = [0, 1, 2, 3] 
    i1 = [0, 0, 1, 0] 

私は1つでi0i1に含まれるAインデックスをインクリメントし、Eインデックスをインクリメントしたいですi1に含まれるものdelta_E

for k, i, j in enumerate(indices[i0], i1): 
    A[i,j] += 1 
    A[j,i] += 1 
    E[i] += delta_E[k] 

結果は:

       マトリックスA

 array([[0, 4, 1], 
       [4, 0, 0], 
       [1, 0, 0]]) 

       マトリックスE

 array([4, 7, 0]) 

上記のforループを行列式に変換できますか?

+0

あなたがnumpyのを見たことがありますか? – sobek

+1

はい、sobek、私は試してみました...しかしあなたが知っている、numpyは非常に多くのメソッドを持っています。 –

+0

私はあなたの計算を再現しようとしています、そして反復のいくつかのバグを打っています。 enumerateにはzipが必要です。delta_E [4]は範囲外です。 – hpaulj

答えて

1
In [182]: for k,(i,j) in enumerate(zip(indices[i0], i1)): 
    ...:  print(k,i,j) 
    ...:  
    ...:  
0 1 0 
1 1 0 
2 0 1 
3 0 2 
4 1 0 

kが一意であるが、i,jインデックスは、重複を有します。 +=のステップをアレイ全体の計算に置き換えるには、A[i] += bの代わりにバッファーされないadd.atを使用する必要があります。 Eについては

In [190]: A = np.zeros_like(C) 
In [191]: np.add.at(A,(indices[i0],i1),1) 
In [192]: np.add.at(A,(i1,indices[i0]),1) 
In [193]: A 
Out[193]: 
array([[0, 4, 1], 
     [4, 0, 0], 
     [1, 0, 0]]) 

、私はあなたの価値を複製することはできませんが、私はループを複製することができます

In [200]: delta_E = np.array([4,2,4,1,0]) 
In [204]: E = np.zeros(3,int) 
In [205]: for k,i in enumerate(indices[i0]): # your loop 
    ...:  E[i] += delta_E[k] 
    ...:  
In [206]: E 
Out[206]: array([5, 6, 0]) 
In [207]: E = np.zeros(3,int) 
In [208]: np.add.at(E,indices[i0],delta_E) 
In [209]: E 
Out[209]: array([5, 6, 0]) 
+0

ありがとう、あなたは私の一日を作る! –

関連する問題