2016-05-02 84 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

您可以將您的示例程序縮減爲只能在兩個維度上運行的程序嗎?可能使它更容易調試。 –

+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