栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Numpy基础(二)——数组转置、计算内积和换轴

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Numpy基础(二)——数组转置、计算内积和换轴

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 = ( a 1 a 2 . . . a n ) , b = ( b 1 b 2 . . . b n ) , (1) a= left( begin{matrix} a_1\ a_2\ ...\ a_n end{matrix} right), b= left( begin{matrix} b_1\ b_2\ ...\ b_n end{matrix} right),tag{1} a=⎝⎜⎜⎛​a1​a2​...an​​⎠⎟⎟⎞​,b=⎝⎜⎜⎛​b1​b2​...bn​​⎠⎟⎟⎞​,(1)

[ a , b ] = a 1 b 1 + a 2 b 2 + . . . + a n b n (2) [a,b]=a_1b_1+a_2b_2+...+a_nb_n tag{2} [a,b]=a1​b1​+a2​b2​+...+an​bn​(2)
  [a,b]称为向量a与b的内积。

  内积是两个向量之间的一种运算,其结果是一个实数,用矩阵记号表示,当a与b都是列向量时,有
[ a , b ] = a b T = ( a 1 , a 2 , . . . , a n ) ∗ ( b 1 , b 2 , . . . , b n ) T (3) [a,b]=ab^T=(a_1,a_2,...,a_n)*(b_1,b_2,...,b_n)^T tag{3} [a,b]=abT=(a1​,a2​,...,an​)∗(b1​,b2​,...,bn​)T(3)

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]]])
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/753305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号