填充numpy数组的对角线失败

时间:2016-01-26 19:25:25

标签: python arrays numpy diagonal

我正在尝试填充矩阵的偏移对角线:

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'

2 个答案:

答案 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))