2016-01-26 96 views
3

我試圖矩陣的補偏移對角線:填寫非對角線numpy的陣列的失敗

loss_matrix = np.zeros((125,125)) 

np.diagonal(loss_matrix, 3).fill(4) 

ValueError: assignment destination is read-only 

兩個問題:)

1沒有遍歷索引,我該怎麼設置一個numpy數組的偏移對角線?

2)爲什麼np.diagonal的結果只讀? numpy.diagonal的文檔顯示如下:「在NumPy 1.10中,它將返回一個讀/寫視圖,寫入返回的數組將改變您的原始數組。」

np.__version__ 

'1.10.1' 
+0

[這個問題](http://stackoverflow.com/questions/10925671/numpy-k-th-diagonal-indices)可能的幫助。 – Cleb

回答

6

discussion對NumPy的問題跟蹤情況來看,它看起來像功能是停留在地獄,他們從來沒有得到周圍固定的文件說被推遲。

如果您需要可寫性,您可以強制它。這將只對與NumPy 1.9工作,並起來,因爲np.diagonal使得較低版本的副本:

diag = np.diagonal(loss_matrix, 3) 

# It's not writable. MAKE it writable. 
diag.setflags(write=True) 

diag.fill(4) 
0

在舊版本,diagflat構建從對角線的數組。

In [180]: M=np.diagflat(np.ones(125-3)*4,3) 
In [181]: M.shape 
Out[181]: (125, 125) 
In [182]: M.diagonal(3) 
Out[182]: 
array([ 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,... 4.]) 

In [183]: np.__version__ 
Out[183]: '1.8.2' 

有效它這樣做(從其Python代碼工作)

res = np.zeros((125, 125)) 
i = np.arange(122) 
fi = i+3+i*125 
res.flat[fi] = 4 

即,它找到對角線的扁平化陣列等效指標。

我還可以得到fi有:

In [205]: i=np.arange(0,122) 
In [206]: np.ravel_multi_index((i,i+3),(125,125)) 
+0

第二個選項適用於負對角線,但第三個選項不適用 – ryan

+0

對於第二個選項,我提出了正偏移的情況。 'ravel'版本可以很容易地適應負偏移 - 可能就像使用'(i + 3,i)'(未測試)一樣簡單 - – hpaulj