Numpy——np.diag()一文看懂

Posted 青_丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy——np.diag()一文看懂相关的知识,希望对你有一定的参考价值。

1.np.diag(v, k):  官方文档如下

@array_function_dispatch(_diag_dispatcher)

def diag(v: Union[ndarray, Iterable, int, float],
              k: Optional[int] = 0) -> Any
Extract a diagonal or construct a diagonal array.
See the more detailed documentation for numpy.diagonal if you use this function to extract a diagonal and wish to write to the resulting array; whether it returns a copy or a view depends on what version of numpy you are using.
See Also
diagonal
Return specified diagonals.
diagflat
Create a 2-D array with the flattened input as a diagonal.
trace
Sum along diagonals.
triu
Upper triangle of an array.
tril
Lower triangle of an array.
Examples
>>> x = np.arange(9).reshape((3,3))
>>> x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> np.diag(x)
array([0, 4, 8])
>>> np.diag(x, k=1)
array([1, 5])
>>> np.diag(x, k=-1)
array([3, 7])
>>> np.diag(np.diag(x))
array([[0, 0, 0],
       [0, 4, 0],
       [0, 0, 8]])
形参:
v – If `v` is a 2-D array, return a copy of its `k`-th diagonal. If `v` is a 1-D array, return a 2-D array with `v` on the `k`-th diagonal.
k – Diagonal in question. The default is 0. Use `k>0` for diagonals above the main diagonal, and `k0` for diagonals below the main diagonal.
返回值:
The extracted diagonal or constructed diagonal array.
docs.scipy.org 的 `diag(v, k=0)` 

看着很唬人,其实很简单,下面我用通俗的话解释一下。

2.解释:

np.diag(v, k)函数有两种用途

  1. 返回二维数组v中k相关的对角线数据组成的一维数组
  2. 返回一个构造的二维与k相关的类对角线形二维数组

2.1 v为一维数组

import numpy as np

v = np.array([1, 2, 3, 4, 5])
Z = np.diag(v)

print(Z)

输出:

 此处k未给定值,为缺省值0.

2.11 k值不为0时

 

 

观察可知,k=1时,原主对角线上的数据整体上移1个单位。由此我们可以推出,当k=-1时,原主对角线上的数据整体下移1个单位

 k = -1 时:

 

2.2 v为二维数组

 

 返回值:默认k=0 返回二维数组主对角线上的数据组成的一维数组

 k = 1 时:

返回整体上移1个单位的一维数组

k = -1时:

 

 3.总结

形参:

v–如果“v”是二维数组,则返回其第k条对角线的副本。如果“v”是一个一维数组,则返回一个在“k”对角上有“v”的二维数组。

k–有问题的对角线。默认值为0。对于主对角线上方的对角线,使用“k>0”,对于主对角线下方的对角线,使用“k<0”。

返回值:

提取的对角数组或构造的对角数组。

 `diag(v,k=0)`

Python构建numpy矩阵

我得到了这个矩阵,我正在尝试编写一个函数来为任意大小的n构建这个矩阵。我被告知矩阵的高度是n,但不确定宽度。

enter image description here

下面是我的代码和输出,这是正确的吗?我对矩阵本身的符号感到有些困惑。

def buildMatrix(n, a):
    matrix = np.zeros([n, n], dtype=float)
    x_diag, y_diag = np.diag_indices_from(matrix)
    for (x,y) in zip(x_diag, y_diag):
        if x > (n / 2):
            matrix[x][y] = -2*a
        elif x == (n / 2):
            matrix[x][y] = -(1 + a)
        else:
            matrix[x][y] = -2

        if x != n - 1:
            matrix[x + 1][y] = a if x >= (n / 2) else 1
            matrix[x][y + 1] = a if x >= (n / 2) else 1

    return matrix

buildMatrix(5, 2)输出

[[-2.  1.  0.  0.  0.]
 [ 1. -2.  1.  0.  0.]
 [ 0.  1. -3.  2.  0.]
 [ 0.  0.  2. -4.  2.]
 [ 0.  0.  0.  2. -4.]]

谁能帮我吗?

答案

要回答您的第一个问题,矩阵必须具有n的宽度,以使矩阵向量乘积兼容。

矩阵的图像在从-2到 - (1-a)到-2a的切换发生的位置是不明确的。在您的代码中,检查x==n/2是否设置开关。这在python2中没问题但是会在python3中引起问题,因为x / 2返回2.5。使用更安全的x==n//2,因为n // 2在python2和python3中返回一个整数。

一般来说,我将假设切换发生在第m行。使用切片和np.diag命令可以更轻松地构建矩阵。

def buildmat(n, m, a):
    diag = np.zeros(n)
    offdiag = np.zeros(n-1)

    offdiag[0:m] = 1
    offdiag[m:n-1] = a

    diag[0:m] = -2
    diag[m] = -(1+a)
    diag[m+1:n] = -2*a

    matrix =  np.diag(diag) + np.diag(offdiag, 1) + np.diag(offdiag, -1)
    return matrix

运行

buildmat(5, 2, 3)

产生

[[-2.  1.  0.  0.  0.]
 [ 1. -2.  1.  0.  0.]
 [ 0.  1. -3.  2.  0.]
 [ 0.  0.  2. -4.  2.]
 [ 0.  0.  0.  2. -4.]]

以上是关于Numpy——np.diag()一文看懂的主要内容,如果未能解决你的问题,请参考以下文章

Python构建numpy矩阵

05-numpy-笔记-fliplr

替换 CuPy 中的 numpy.apply_along_axis

numpy奇异值分解,广义逆矩阵与行列式

转:numpy.linalg.eig() 计算矩阵特征向量

一文带你斩杀Python之Numpy☀️Pandas全部操作全网最详细❗❗❗