说明
NumPy 教程 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本文介绍 NumPy 通过构建一定规则的矩阵,这些矩阵往往具有特定的用途,这些方法可以大大提高我们构造相应矩阵的效率。
有以下常用的方法,可以构建一定规则的矩阵(按 np.xxx 格式使用)。
方法 | 说明 |
---|---|
np.diag(v[, k]) | 提取对角线或构造对角线数组 |
np.diagflat(v[, k]) | 创建一个二维数组,将展平的输入作为对角线 |
np.tri(N[, M, k, dtype]) | 在给定的对角线上和对角线下为 1,在其他地方为 0 |
np.tril(m[, k]) | 数组的下三角 |
np.triu(m[, k]) | 数组的上三角 |
np.vander(x[, N, increasing]) | 生成范德蒙矩阵(Vandermonde matrix) |
如果传入的是一个二维数组,提取出对角线的值形成一个一维数组,还可以传入参数 k 对对角线做下移和下移;如果传入一个一维数组,则生成一个对角线数组,对角线上的值为一维数组的值。
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.arange(4))
'''
array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3]])
'''
np.diag(np.arange(4), k=-1) # 下移一位
# 提取出对角线再将对象线生成方阵
np.diag(np.diag(x))
'''
array([[0, 0, 0],
[0, 4, 0],
[0, 0, 8]])
'''
将原数组(array_like)展平输入作为对角线二维数组的对角线的值。
np.diagflat([[1,2], [3,4]])
'''
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
'''
# 设定 k 值,上移 1 位
np.diagflat([1,2], 1)
'''
array([[0, 1, 0],
[0, 0, 2],
[0, 0, 0]])
'''
用于创建一个数组,该数组在给定对角线处和下方(在这种情况下为k)包含1,在数组的所有其他位置包含 0。
# 语法
# numpy.tri(N, M=None, k=0, dtype=<class 'float'>)
# 上移 2 位
np.tri(3, 5, 2, dtype=int)
'''
array([[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]])
'''
# 下移一位
np.tri(3, 5, -1)
'''
array([[0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[1., 1., 0., 0., 0.]])
'''
数组的下三角矩阵,返回一个数组的副本,该数组的第 k 条对角线上方的元素为零。
np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
'''
array([[ 0, 0, 0],
[ 4, 0, 0],
[ 7, 8, 0],
[10, 11, 12]])
'''
数组的上三角形,返回一个矩阵的副本,其中第 k 条对角线以下的元素归零。
np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
'''
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 0, 8, 9],
[ 0, 0, 12]])
'''
法国数学家范德蒙(Alexandre-Théophile Vandermonde) 是行列式的奠基者之一,他在十八世纪提出行列式专有符号,将行列式应用于解线性方程组,并且对行列式理论进行了开创性的研究。两百多年后,他的名字因为一个特殊矩阵而经常被提及。
一个e阶的范德蒙行列式由e个数c₁,c₂,…,cₑ决定,它的第1行全部都是1,也可以认为是c₁,c₂,…,cₑ各个数的0次幂,它的第2行就是c₁,c₂,…,cₑ(的一次幂),它的第3行是c₁,c₂,…,cₑ的二次幂,它的第4行是c₁,c₂,…,cₑ的三次幂,…,直到第e行是c₁,c₂,…,cₑ的e-1次幂。
生成范德蒙矩阵(Vandermonde matrix,又称范德蒙特行列式),输出矩阵的列是输入向量的幂。幂的顺序由递增的布尔参数决定。具体地说,当递增为 False 时,第 i 个输出列是按 N-i-1 的幂提升的输入向量元素。这样一个每行有一个几何级数的矩阵被命名为 Alexandre-Theophile Vandermonde。可用来证明一个矩阵的不同特征根的特征向量线性无关。
# 语法
np.vander(x, N=None, increasing=False)
x = np.array([1, 2, 3, 5])
N = 3
np.vander(x, N)
'''
array([[ 1, 1, 1],
[ 4, 2, 1],
[ 9, 3, 1],
[25, 5, 1]])
'''
np.column_stack([x**(N-1-i) for i in range(N)])
'''
array([[ 1, 1, 1],
[ 4, 2, 1],
[ 9, 3, 1],
[25, 5, 1]])
'''
x = np.array([1, 2, 3, 5])
np.vander(x)
'''
array([[ 1, 1, 1, 1],
[ 8, 4, 2, 1],
[ 27, 9, 3, 1],
[125, 25, 5, 1]])
'''
np.vander(x, increasing=True) # 升序
'''
array([[ 1, 1, 1, 1],
[ 1, 2, 4, 8],
[ 1, 3, 9, 27],
[ 1, 5, 25, 125]])
'''
# 平方范德蒙矩阵行列式是输入向量值之差的乘积
np.linalg.det(np.vander(x))
# 48.000000000000043 # may vary
(5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1)
# 48
更新时间:Jan. 7, 2021, 1:05 p.m. 标签:numpy array