我正在尝试填充矩阵的偏移对角线:
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 :(得分:6)
根据NumPy问题跟踪器上的discussion判断,看起来该功能陷入困境,他们从来没有修复文档说它被推迟了。
如果您需要可写性,可以强制它。这只适用于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)
答案 1 :(得分: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))