NumPy基础之矩阵的运算
矩阵运算
矩阵运算包括矩阵的加法、减法、乘法(相乘与点乘)、矩阵的转置等,接下来详细讲解矩阵运算。
- 矩阵的加减法,具体示例如下所示:
In [103]: import numpy as np
In [104]: a = np.random.randint(10,size = 20).reshape(4,5)
In [105]: b = np.random.randint(10,size = 20).reshape(4,5)
In [106]: c = np.mat(a)
In [107]: d = np.mat(b)
In [108]: e = c + d
In [109]: f = c - d
上述代码是两矩阵的加减法运算,其中In [104] 和In [105]是创建两个4×5的随机数组并分别赋值给变量a,b;In [106]和In [107]是将数组转换成相应的矩阵并分别赋值给变量c,d;In [108]是将矩阵的加法运算结果赋值给变量e;In [109]是将矩阵的减法运算结果赋值给变量f;c,d,e,f的运行结果如下所示:
In [110]: c
Out[110]:
matrix([[1, 2, 8, 7, 9],
[9, 5, 4, 7, 0],
[1, 1, 7, 7, 1],
[8, 3, 5, 2, 8]])
In [111]: d
Out[111]:
matrix([[6, 3, 4, 5, 7],
[3, 6, 7, 6, 5],
[6, 3, 3, 8, 6],
[6, 7, 1, 6, 2]])
In [112]: e
Out[112]:
matrix([[ 7, 5, 12, 12, 16],
[12, 11, 11, 13, 5],
[ 7, 4, 10, 15, 7],
[14, 10, 6, 8, 10]])
In [113]: f
Out[113]:
matrix([[-5, -1, 4, 2, 2],
[ 6, -1, -3, 1, -5],
[-5, -2, 4, -1, -5],
[ 2, -4, 4, -4, 6]])
从上述运行结果可以看出矩阵的减法与数组的加减法运算相似,都是相同位置数据进行加减运算,并且同样要求相互运算的矩阵含有相同的行列数。
- 矩阵的乘法(相乘与点乘)
矩阵的相乘,具体示例如下所示:
In [114]: import numpy as np
In [115]: a = np.random.randint(10,size = 20).reshape(4,5)
In [116]: b = np.random.randint(10,size = 20).reshape(5,4)
In [117]: c = np.mat(a)
In [118]: d = np.mat(b)
In [119]: e = c * d
上述代码是两矩阵的相乘运算,其中In [115] 和In [116]是创建一个4×5的随机数组和一个5×4的随机数组并分别赋值给变量a,b;In [117]和 In [118]是将数组转换成相应的矩阵并分别赋值给变量c,d;In [119]是将矩阵的相乘运算结果赋值给变量e; c,d,e的运行结果如下所示:
In [120]: c
Out[120]:
matrix([[7, 5, 3, 5, 2],
[5, 4, 3, 3, 0],
[3, 9, 9, 6, 6],
[1, 3, 4, 5, 6]])
In [121]: d
Out[121]:
matrix([[6, 6, 1, 6],
[4, 5, 5, 0],
[5, 2, 0, 8],
[0, 3, 0, 2],
[1, 4, 6, 3]])
In [122]: e
Out[122]:
matrix([[ 79, 96, 44, 82],
[ 61, 65, 25, 60],
[105, 123, 84, 120],
[ 44, 68, 52, 66]])
从上述运行结果可以看出,一个4×5的矩阵与一个5×4的矩阵相乘最终得到一个4×4的矩阵。矩阵的相乘运算要求两相乘矩阵的行数等于列数,即当满足矩阵a的行数等于矩阵b的列数,矩阵b的行数等于矩阵a的行数,矩阵a与矩阵b才能进行相乘,并且二者相乘顺序不同也会导致结果不同,具体相乘规则如下图所示。
矩阵相乘运算规则.jpg
矩阵的点乘,具体示例如下所示:
In [123]: import numpy as np
In [124]: a = np.random.randint(10,size = 20).reshape(4,5)
In [125]: b = np.random.randint(10,size = 20).reshape(4,5)
In [126]: c = np.mat(a)
In [127]: d = np.mat(b)
In [128]: e = np.multiply(a,b)
上述代码是两矩阵的相乘运算,其中In [124] 和In [125]是创建两个4×5的随机数组并分别赋值给变量a,b;In [126]和In [127]是将数组转换成相应的矩阵并分别赋值给变量c,d;In [128]是将矩阵的点乘运算结果赋值给变量e; c,d,e的运行结果如下所示:
In [129]: c
Out[129]:
matrix([[4, 0, 8, 6, 4],
[7, 9, 4, 9, 9],
[9, 3, 1, 2, 5],
[7, 9, 3, 6, 1]])
In [130]: d
Out[130]:
matrix([[0, 4, 6, 3, 4],
[5, 2, 1, 8, 8],
[5, 2, 4, 5, 8],
[9, 4, 8, 7, 8]])
In [131]: e
Out[131]:
array([[ 0, 0, 48, 18, 16],
[35, 18, 4, 72, 72],
[45, 6, 4, 10, 40],
[63, 36, 24, 42, 8]])
矩阵的点乘运算与数组乘法相似,也需要相互运算的矩阵行列数相同,所不同的是矩阵点乘使用的np.multiple(a,b)函数进行运算,而数组直接是a*b。
- 矩阵的转置,具体示例如下所示:
In [132]: import numpy as np
In [133]: a = np.random.randint(10,size = 20).reshape(4,5)
In [134]: b = np.mat(a)
In [135]: c = b.T
上述代码是矩阵的转置,其中In [133]是创建一个4×5的随机数组并赋值给变量a;In [134]是将数组转换成相应的矩阵并赋值给变量b;In [135]是求矩阵的转置并将结果赋值给变量c;a,b,c的运行结果如下所示:
In [136]: a
Out[136]:
array([[6, 3, 5, 7, 0],
[6, 9, 4, 0, 2],
[2, 2, 5, 3, 9],
[2, 1, 8, 3, 7]])
In [137]: b
Out[137]:
matrix([[6, 3, 5, 7, 0],
[6, 9, 4, 0, 2],
[2, 2, 5, 3, 9],
[2, 1, 8, 3, 7]])
In [138]: c
Out[138]:
matrix([[6, 6, 2, 2],
[3, 9, 2, 1],
[5, 4, 5, 8],
[7, 0, 3, 3],
[0, 2, 9, 7]])
矩阵的转置即将矩阵的行列相互转置,因此a×b的矩阵转置之后会得到b×a的矩阵,正如上述运行结果所示,4×5的矩阵b转置之后得到5×4的矩阵c。具体转置原理如下图所示。
转置原理.png