1 数组转置
转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。利用数组的transpose方法或者数组的T属性实现。
In [88]: arr=np.arange(15).reshape((3,5))
In [89]: arr
Out[89]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [90]: arr.T
Out[90]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
2 计算内积
进行矩阵计算时,可以做一些特定的操作,比如:利用np.dot()函数计算矩阵的内积。
2.1 内积
2.1.1 定义
假设有n维向量a,b
令
[a,b]称为向量a与b的内积。
内积是两个向量之间的一种运算,其结果是一个实数,用矩阵记号表示,当a与b都是列向量时,有
2.1.2 示例
a=(1,2),b=(3,4)
[a,b]=1*3+2*4=11
2.2 np.dot() 函数
dot函数是numpy库下的一个函数,主要用于矩阵的乘法运算,其中包括:向量内积、多维矩阵乘法和矩阵与向量的乘法。
2.2.1 向量内积
向量其实是一维的矩阵,两个向量进行内积计算时,需要保证两个向量包含的元素数目是相同的。
In [91]: a=np.array([1,2])
In [92]: b=np.array([3,4])
In [93]: np.dot(a,b)
Out[93]: 11
2.2.2 矩阵乘法运算
两个矩阵(a,b)可以进行乘法运算的条件:
a为m*n阶矩阵,b为n*p阶矩阵,相乘的结果为m*p阶矩阵。
In [94]: a=np.arange(15).reshape(3,5)
In [95]: b=np.arange(15).reshape(5,3)
In [96]: a
Out[96]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [97]: b
Out[97]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
In [100]: result=np.dot(a,b)
In [101]: result
Out[101]:
array([[ 90, 100, 110],
[240, 275, 310],
[390, 450, 510]])
In [106]: print("a阶数:"+str(a.shape))
...: print("b阶数:"+str(b.shape))
...: print("[a,b]阶数"+str(result.shape))
a阶数:(3, 5)
b阶数:(5, 3)
[a,b]阶数(3, 3)
计算过程是将a矩阵的第i行的元素与b矩阵第i列中对应元素相乘,再相加所得结果为result中的第i行i列。以result[0,0]=90为例:
result[0,0]=0*0+1*3+2*6+3*9+4*12=90
2.2.3 矩阵与向量乘法
矩阵a为m*n阶,向量y为n阶向量,则矩阵x和向量y可以进行乘法运算,结果为m阶向量。进行运算时,会首先将后一面一项进行转置,再进行乘法运算。
In [109]: a=np.arange(6).reshape((2,3))
In [110]: a
Out[110]:
array([[0, 1, 2],
[3, 4, 5]])
In [111]: b=np.array([1,2,3])
In [112]: b
Out[112]: array([1, 2, 3])
In [113]: result=np.dot(a,b)
In [114]: result
Out[114]: array([ 8, 26])
3 换轴
利用transpose函数,会使数组发生莫名其妙的改变,可以通过画图来理解换轴是如何改变数组内元素的排布的。
3.1 二维数组
In [116]: x_2d=np.arange(4).reshape((2,2))
In [117]: x_2d
Out[117]:
array([[0, 1],
[2, 3]])
首先生成一个二维数组,x_2d,该数组中的元素是以下面的方式排布的:
x_2d[0][0]==0 x_2d[0][1]==1
x_2d[1][0]==2 x_2d[1][1]==3
其中,第一个方括号为0轴,第二个方括号为1轴,就此可以建立一个以0轴为x轴,1轴为y轴的平面直角坐标系。
In [118]: x_2d.transpose()
Out[118]:
array([[0, 2],
[1, 3]])
对于二维数组,transpose在不指定参数时默认是矩阵转置。
In [119]: x_2d.transpose(0,1)
Out[119]:
array([[0, 1],
[2, 3]])
0轴,1轴的位置不变,数组也就不发生改变。
In [120]: x_2d.transpose(1,0)
Out[120]:
array([[0, 2],
[1, 3]])
0轴,1轴的位置发生改变,数组随之发生改变,也就是说坐标系的0轴,1轴上的元素发生了交换。
用红色标注的为转轴后发生改变的地方。
3.2 三维数组
In [121]: x_3d=np.arange(16).reshape((2,2,4))
In [122]: x_3d
Out[122]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
以0轴为x轴,1轴为y轴,2轴为z轴,建立一个空间直角坐标系。
In [123]: x_3d.transpose()
Out[123]:
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
In [124]: x_3d.transpose(2,1,0)
Out[124]:
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
对于二维数组,transpose在不指定参数时默认是0轴与2轴转换。
In [125]: x_3d.transpose(1,0,2)
Out[125]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
用红色标注的为转轴后发生改变的地方。
swapaxes方法
ndarray有一个swapaxes方法,该方法接收一对轴编号作为参数,并对轴进行调整用于重组数据:
In [5]: x_3d.swapaxes(0,1)
Out[5]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])