Numpy:影响1.10之前矩阵的对角线元素

Foo*_*Bar 5 python numpy matrix diagonal

我想改变2d矩阵的对角元素.这些都是主要和非主要对角线.

numpy.diagonal() 在NumPy 1.10中,它将返回一个读/写视图,写入返回的数组将改变您的原始数组.

numpy.fill_diagonal(),numpy.diag_indices() 仅适用于主对角元素

这是我的用例:我想重新创建以下形式的矩阵,使用对角表示法非常简单,因为我将x,y,z作为数组.

矩阵

ely*_*ase 5

尝试这个:

>>> A = np.zeros((6,6))
>>> i,j = np.indices(A.shape)
>>> z = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

现在,您可以直观地访问任何对角线:

>>> A[i==j-1] = z
>>> A
array([[ 0.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  2.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  3.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  4.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  5.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

您可以用相同的方式将数组分配给A[i==j],等等。


Ale*_*ley 5

您始终可以使用切片为对角线分配值或数组。

传入行索引列表和列索引列表可让您直接(且有效地)访问位置。例如:

>>> z = np.zeros((5,5))
>>> z[np.arange(5), np.arange(5)] = 1 # diagonal is 1
>>> z[np.arange(4), np.arange(4) + 1] = 2 # first upper diagonal is 2
>>> z[np.arange(4) + 1, np.arange(4)] = [11, 12, 13, 14] # first lower diagonal values
Run Code Online (Sandbox Code Playgroud)

将零数组更改z为:

array([[  1.,   2.,   0.,   0.,   0.],
       [ 11.,   1.,   2.,   0.,   0.],
       [  0.,  12.,   1.,   2.,   0.],
       [  0.,   0.,  13.,   1.,   2.],
       [  0.,   0.,   0.,  14.,   1.]])
Run Code Online (Sandbox Code Playgroud)

一般来说,对于k x k名为的数组z,您可以设置第ith 个上对角线

z[np.arange(k-i), np.arange(k-i) + i]
Run Code Online (Sandbox Code Playgroud)

和第ith 下对角线

z[np.arange(k-i) + i, np.arange(k-i)]
Run Code Online (Sandbox Code Playgroud)

注意:如果你想避免np.arange多次调用,你可以简单地写ix = np.arange(k)一次,然后根据需要对该范围进行切片:

np.arange(k-i) == ix[:-i]
Run Code Online (Sandbox Code Playgroud)