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
python tensor内积 numpy求内积_2d

python tensor内积 numpy求内积_2d_02
  [a,b]称为向量a与b的内积。

  内积是两个向量之间的一种运算,其结果是一个实数,用矩阵记号表示,当a与b都是列向量时,有
python tensor内积 numpy求内积_python_03

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轴的平面直角坐标系。

python tensor内积 numpy求内积_2d_04

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轴上的元素发生了交换。

python tensor内积 numpy求内积_线性代数_05

  用红色标注的为转轴后发生改变的地方。

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轴,建立一个空间直角坐标系。

python tensor内积 numpy求内积_python tensor内积_06

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]]])

python tensor内积 numpy求内积_2d_07

  用红色标注的为转轴后发生改变的地方。

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]]])