用python替换2D数组的对角线

Die*_*oDZ 5 python arrays numpy diagonal

我有以下二维数组

A=([[1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16])
Run Code Online (Sandbox Code Playgroud)

我想用数组替换主对角线

a = ([0,2,15,20])
Run Code Online (Sandbox Code Playgroud)

因此,结果必须是

A=([[0, 2, 3, 4],
    [5, 2, 7, 8],
    [9, 10, 15, 12],
    [13, 14, 15, 20])
Run Code Online (Sandbox Code Playgroud)

我尝试使用np.diag(a,k = 0),但是它不起作用,因为np.diag()创建了一个带有数组“ a”的对角2D数组。

有没有办法用numpy做到这一点?上面的例子是最简单的例子。我希望不仅可以更改邮件对角线,还可以更改所有对角线。

Wil*_*sem 5

你可以用np.fill_diagonal(..)它。就像文档说的:

numpy.fill_diagonal(a, val, wrap=False)

填充任意维度的给定数组的主对角线。

例如:

np.fill_diagonal(A, 20)
Run Code Online (Sandbox Code Playgroud)

因此,我们在这里广播 20整个对角线。

您还可以使用不同的值填充对角线,例如:

np.fill_diagonal(A, [0,2,15,20])
Run Code Online (Sandbox Code Playgroud)

例如:

>>> a = np.zeros((4,4))
>>> np.fill_diagonal(a, [0,2,15,20])
>>> a
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  0.],
       [ 0.,  0., 15.,  0.],
       [ 0.,  0.,  0., 20.]])
Run Code Online (Sandbox Code Playgroud)

如果您想更改其他对角线,则需要镜像阵列。例如对于antidiagonal,我们可以使用:

np.fill_diagonal(A[::-1], -20)
Run Code Online (Sandbox Code Playgroud)

然后我们得到:

>>> A = np.zeros((4,4))
>>> np.fill_diagonal(A[::-1], -20)
>>> A
array([[  0.,   0.,   0., -20.],
       [  0.,   0., -20.,   0.],
       [  0., -20.,   0.,   0.],
       [-20.,   0.,   0.,   0.]])
Run Code Online (Sandbox Code Playgroud)

如果我们不考虑对角线次对角线,一个n维矩阵有n×(n-1) 条对角线。我们可以通过镜像一个或多个维度来分配它。