numpy数组的非对角线填充失败

3

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

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'

这个问题或许能提供帮助:https://dev59.com/rmgu5IYBdhLWcg3w_b9V。 - Cleb
2个回答

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

第二个选项适用于负对角线,但第三个选项不适用。 - ryan
对于第二个,我排除了正偏移的情况。ravel版本可以很容易地适应负偏移 - 可能只需使用(i+3,i)(未经测试)。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接