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做到这一点?上面的例子是最简单的例子。我希望不仅可以更改邮件对角线,还可以更改所有对角线。
你可以用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) 条对角线。我们可以通过镜像一个或多个维度来分配它。