2016-05-02 16 views
-1

私は、より大きな2次元行列のサブセットとして2次元行列を保存する関数を書いています。 einsumの結果が行列E(3行目から最後の行)に格納されていないことを除いて、すべてのコードが正しく動作しているようです。どのようにこれを修正するための任意の提案?インデクシングnumpy配列が機能しない

def two_cycles(A): 
     nonzeroSubset = np.diag(la.matrix_power(A,4) - la.matrix_power(A,2)) 
     x = np.argsort(nonzeroSubset)[:100] 
     subset = A[x,:][:,x] 

     n = len(A) 
     E = np.zeros((n,n)) 

     E[x][:,x] = np.einsum('ij,ji->ij',subset,subset) 
     fourCycles = np.array(np.nonzero(E)).T 
     return fourCycles 
+0

サンプルプログラムを、わずか2次元で動作するものにまで減らすことはできますか?デバッグするのがずっと楽になるかもしれません。 –

+0

私はこの例を更新しました。 – user3394045

+2

"E [x] [:、x、:、:] [:、:、x、:] [:、:、:x] = ..." - 大丈夫です。インデックス作成のルール。それはあなたが割り当てたいもののコピーのコピーのコピーに割り当てます。 – user2357112

答えて

3
x = np.argsort(nonzeroSubset)[:100] 
... 
E[x][:,x] = .... 

のでxは、インデックスのリストです。つまり、E[x]は高度なインデックス作成を使用し、コピーです。 E[...][...]は有用な値(A[x,:][:,x]のように)を返すことができますが、最初のインデックスがコピーを生成する場合、割り当てには機能しません。一般的には、numpyのような二重括弧を使用しないでください。代わりに、一組の括弧(および多次元インデックス)を使用して、望ましい索引付けを実行する方法を理解してください。

Eの対角線の値を(特定の順序で)割り当てようとしていますか?ここで

はフェッチと、アレイの対角線に割り当てる両方の方法です:

In [379]: A=np.arange(9).reshape(3,3) 

In [380]: ind=np.diag_indices(3) 

In [381]: ind 
Out[381]: (array([0, 1, 2]), array([0, 1, 2])) 

In [382]: A[ind] 
Out[382]: array([0, 4, 8]) 

In [383]: A[ind]=[8,4,0] 

In [384]: A 
Out[384]: 
array([[8, 1, 2], 
     [3, 4, 5], 
     [6, 7, 0]]) 

私はあなたのケースで、これは動作するはずだと思う(しかし、それをテストしていない):

x = np.argsort(nonzeroSubset)[:100] 
    subset = A[x,x] # diagonals of A in a sorted order 
    .... 
    E[x,x] = np.einsum('ij,ji->ij',subset,subset) 
    # assignment to diagonal in the same order 
関連する問題