Numpy是Python的一个重要科学计算库。

矩阵操作是深度学习、数值计算的重要部分。

只介绍矩阵操作的代码实现,不介绍数学原理。

下面是一些常用的使用Numpy库矩阵操作。

import numpy as np写在最前面,代码段中不再添加

1 矩阵创建

(1)通过列表创建矩阵

a3 = np.mat([[1], [2], [3]])

(2)创建特殊元素矩阵

data1 = np.mat(np.zeros((2, 3)))  # 创建一个2行3列的全0矩阵
data2 = np.mat(np.ones((2, 4)), dtype=int)  # 创建一个2行4列的全1矩阵,且元素为整数型
data3 = np.mat(np.random.rand(2, 5))  # 创建一个2行5列的矩阵,矩阵元素为0-1之间的随机数
data4 = np.random.rand(2, 5)  # 注意,此行创建的是一个2维数组(不是列表),如要进行矩阵操作,需要将其转换成matrix
data5 = np.mat(data4)  # data5是一个矩阵
data6 = np.mat(np.random.randint(1, 10, size=(3, 5)))  # 生成一个3*5的1-9之间的随机整数矩阵
data7 = np.mat(np.eye(2, 2, dtype=int))  # 生成2*2的单位对角阵,且元素为整数型
a1 = [1, 2, 3]
a2 = np.mat(np.diag(a1))  # 生成一个以a1为对角线的对角阵

(3)复制矩阵

data3 = np.mat(np.random.rand(2, 5))  # 创建一个2行5列的矩阵,矩阵元素为0-1之间的随机数
data4 = data3.copy # 复制一个data3
data5 = np.ones_like(data4) # 返回一个用1填充的跟输入矩阵data4形状和类型一样的矩阵
data6 = np.zeros_like(data4) # 返回一个用0填充的跟输入矩阵data4形状和类型一样的矩阵

2 矩阵计算

(1)矩阵乘法

a1 = np.mat([1, 1])
a2 = np.mat([2, 2])
a3=a1 * a2

(2)矩阵各个元素对应相乘(不是矩阵乘法)

# 矩阵对应元素相乘
a1 = np.mat([1, 1])
a2 = np.mat([2, 2])
a3 = np.multiply(a1, a2)

  (3) 矩阵数乘

a1 = np.mat([1, 1])
a2= 5*a1

  (4) 可逆矩阵求逆

# 矩阵求逆
a1 = np.mat([[0.5,0],[0,0.5]])
a2 = np.linalg.inv(a1) 
a3 = a1**(-1) # 两者等效

(5)矩阵转置

# 矩阵转置
a1 = np.mat([[1, 1], [0, 5]])
a2 = np.transpose(a1)

(6)求列和、行和、所有元素和

a1 = np.mat([[1, 1], [0, 5]])
a2 = np.sum(a1, axis=0)  # 列和,这里得到的是1*2的矩阵
a3 = np.sum(a1, axis=1)  # 行和,这里得到的是2*1的矩阵
a4 = np.sum(a1[0, :])  # 计算第一行所有列的和,这里得到的是一个数值
a5 = np.sum(a1[:, 1])  # 计算第二列所有行的和,这里得到的是一个数值 ,注意逗号与冒号的位置
a6 = np,sum(a1) # 计算矩阵中所有元素和

(7)计算矩阵中的最值及其索引

# 计算最值
a2 = np.max(a1)  # 计算a1矩阵中所有元素的最大值,这里得到的结果是一个数值
a3 = max(a1[:, 1])  # 计算第二列的最大值,这里得到的是一个1*1的矩阵
a4 = np.max(a1[1, :])  # 计算第二行的最大值,这里得到的是一个一个数值
a5 = np.max(a1, 0)  # 计算各列的最大值,返回1*2矩阵
a6 = np.max(a1, 1)  # 计算各行的最大值,这里得到是一个2*1矩阵
a7 = np.argmax(a1, 0)  # 计算所有列的最大值对应在该列中的索引
a8 = np.argmax(a1[1, :])  # 计算第二行中最大值对应在改行的索引

3 矩阵分割

a = np.mat([[1, 2, 3], [4, 5, 6], [7,8,9]])
b = a[1:, 1:]  # 分割出第二行以后的行和第二列以后的列的所有元素,实际上就是右下角的2*2矩阵

4 矩阵合并

a = np.mat(np.ones((2, 2)))
b = np.mat(np.eye(2))
c = np.vstack((a, b))  # 按列合并,即增加行数,在a矩阵下面加
d = np.hstack((a, b))  # 按行合并,即行数不变,在a矩阵右边加

5 矩阵转化

        矩阵matrix、列表list、数组array的互相转换。

(1)三者之区别

      普通列表(list)可以修改,并且列表中元素可以使不同类型的数据;

      对于 Numpy中的数组(array),其所有元素必须为同一类型,list转化为array时会被强制转换类型;

      将数组array与矩阵matrix打印出来后,他们在形式上很类似,但是array为数组,不能进行矩阵相关运算。

(2)三者之转换

      1)列表转化为数组或矩阵

a1 = [[1, 2], [3, 2]]  # 一个二维list列表
a2 = np.array(a1)  # 将列表转换成二维数组
a3 = np.mat(a1)  # 将列表转化成2*2矩阵

     2)矩阵转化为数组或列表

a1 = [[1, 2], [3, 2]]
a3 = np.mat(a1)  # 将列表转化成2*2矩阵

a4 = np.array(a3)  # 将矩阵转换成array数组
a5 = a3.tolist()  # 将矩阵转换成list列表

     3)数组转化为矩阵或列表

a1 = [[1, 2], [3, 2]]  # 一个二维list列表
a2 = np.array(a1)  # 将列表转换成二维数组

a6 = a2.tolist()  # 将array数组转换成list列表
a7 = np.mat(a2)  # 将array数组转换成matrix矩阵

    4)特别注意

    若先将一维列表转换成矩阵,再通过tolist()换回得一新列表,该新列表与最初列表不同。

a1 = [1, 2, 3]
a2 = np.array(a1)
a3 = np.mat(a1)
a4 = a2.tolist()  # 这里得到的是[1,2,3], 与a1相同
a5 = a3.tolist()  # 这里得到的是[[1,2,3]], 与a1不同

     解决方法为:

a1 = [1, 2, 3]
a5 = a3.tolist()  # 这里得到的是[[1,2,3]]
a6 = a5[0] # 这里得到的是[1,2,3], 与a1相同
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐