填充 numpy 数组的对角线失败

fill off diagonal of numpy array fails

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

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 的文档内容如下:"In NumPy 1.10, it will return a read/write view and writing to the returned array will alter your original array."

np.__version__

'1.10.1'

根据 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)

在旧版本中,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))