python的numpy库的trace()函数,计算对角线元素的和。
用法
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None)
描述
numpy.trace(a),返回数组a的对角线元素的和。
入参
a:必选,数组,列表,元组;
offset:可选,整数,默认为0,表示对角线的偏移量;
axis1,axis2:可选,整数,axis1默认为0,axis2默认为1,表示组成二维数组的轴,指定对角线的轴;
1.1.1 入参a
numpy.trace(a)的入参a为必选入参,必须为二维及以上维度的数组,不能为一维数组。
可以为列表、元组、数组。
>>> import numpy as np
# trace(a)返回对角线元素的和
# 入参a 为列表
>>> np.trace([[1,2,3],[4,5,6],[7,8,9]])
15
# 入参a 为元组
>>> np.trace(((1,2,3),(4,5,6),(7,8,9)))
15
# 入参a 为数组
>>> np.trace(np.arange(1,10).reshape(3,3))
15
# 入参a至少为二维数组,不能为一维数组
>>> np.trace([1,2,3])
Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>np.trace([1,2,3])File "D:\python39\lib\site-packages\numpy\core\fromnumeric.py", line 1761, in tracereturn asanyarray(a).trace(offset=offset, axis1=axis1, axis2=axis2, dtype=dtype, out=out)
ValueError: diag requires an array of at least two dimensions
1.1.2 入参offset
numpy.trace(a,offset)的入参offset为可选入参,整数,默认为0,即主对角线。
二维数组a主对角线的元素为a[i,i],即行和列的索引相同,带有偏移量offset的二维数组对角线的元素为a[i,i+offset]。
二维数组v可以通过numpy.diag(v,k)查看对角线的元素,参考《python数据分析numpy基础之diag处理矩阵对角线元素》
>>> import numpy as np
# trace(a,offset)的入参offset为对角线偏移量
# 带有偏移量的对角线元素a[i,i+offset]
# 通过diag()查看具有偏移量的对角线元素
>>> ar1=np.arange(1,26).reshape(5,5)
>>> ar1
array([[ 1, 2, 3, 4, 5],[ 6, 7, 8, 9, 10],[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],[21, 22, 23, 24, 25]])
# offset=0表示主对角线
>>> np.trace(ar1,offset=0)
65
>>> np.diag(ar1,k=0)
array([ 1, 7, 13, 19, 25])
>>> np.sum(np.diag(ar1,k=0))
65
# trace()offset=1求偏移量为1的对角线元素和
>>> np.trace(ar1,offset=1)
44
# diag()k=1查看偏移量为1的对角线元素
>>> np.diag(ar1,k=1)
array([ 2, 8, 14, 20])
>>> sum(np.diag(ar1,k=1))
44
>>> np.trace(ar1,offset=-1)
60
>>> np.diag(ar1,k=-1)
array([ 6, 12, 18, 24])
>>> sum(np.diag(ar1,k=-1))
60
1.1.3 trace三维数组对角线的和
numpy.trace(a)的入参a若为三维及以上维度的数组,则使用入参axis1和axis2确定对角线。
比如三维数组ar3,使用np.trace(ar3,axis1=0,axis2=1)计算对角线的元素的和:
通过axis1和axis2指定二维数组的对角线,axis1和axis2相当于行和列,而主对角线的元素具有相同的行和列索引,所以,三维数组的主对角线的元素是axis1和axis2轴的索引相同的元素。
如上图,ar3=np.arange(24).reshape(2,3,4),ar3为三维数组,np.trace(ar3,axis1=0,axis2=1)表示,0轴和1轴组成二维数组,它的主对角线的元素是具有相同0轴和1轴索引的元素。
所以,0轴1轴索引为0的对角线元素为ar3[0,0,:],
0轴1轴索引为1的对角线元素为ar3[1,1,:],
共有4条对角线,分别将4条对角线的元素和,作为trace()的结果,最终得到一个一维数组。
>>> import numpy as np
# trace(a)若a为三维数组,通过axis1和axis2指定二维数组的主对角线
# 又,主对角线元素具有相同的行索引和列索引
# 即axis1和axis2的索引相同的元素
>>> ar3=np.arange(24).reshape(2,3,4)
>>> ar3
array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])
# 0轴和1轴对角线索引为0的元素
>>> ar3[0,0,:]
array([0, 1, 2, 3])
# 0轴和1轴对角线索引为1的元素
>>> ar3[1,1,:]
array([16, 17, 18, 19])
# 对角线元素求和
>>> ar3[0,0,:]+ar3[1,1,:]
array([16, 18, 20, 22])
>>> np.trace(ar3,axis1=0,axis2=1)
array([16, 18, 20, 22])
# axis1=0,axis2=2 计算
>>> ar3[0,:,0]
array([0, 4, 8])
>>> ar3[1,:,1]
array([13, 17, 21])
>>> ar3[0,:,0]+ar3[1,:,1]
array([13, 21, 29])
>>> np.trace(ar3,axis1=0,axis2=2)
array([13, 21, 29])