目录
umpy是python机器学习技术栈的基础,它可以对机器学习中常用的数据结构(向量 vector、矩阵 matrices、张量 tensor) 进行高效的操作。因此,在最开始,我们先要熟悉 numpy 的基础操作。
1. 向量的基本操作
Numpy的主要数据结构是多维数组。
向量,其实就是一个一维数组,我们可以水平地(行向量)或垂直地(列向量)表示它。numpy的数组索引是从0开始的,可以通过索引或者切片方式访问元素。
#加载库
import numpy as np
#创建一个行向量
vector_row=np.array([1,2,3,4,5])
#创建一个列向量
vector_column=np.array([1],[2],[3],[4],[5])
#选择向量中的一个元素
print(vector_row[2]) # 3
print(vector_column[2]) # [3]
#选取一个向量中的所有元素
print(vector_row[:]) #[1,2,3,4,5]
#向量的切片操作
print(vector_row[:2]) #[1 2]
print(vector_column[:2]) # [[1]
# [2]]
向量 和 的点积定义为 ,在NumPy中用dot 或 @(python 3.5及以上)实现:
import numpy as np
# 创建向量
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])
# 计算点积
print(np.dot(vector_a, vector_b)) #32
print(vector_a @ vector_b) #32
2. 矩阵的基本操作
2.1 创建矩阵
创建矩阵通常用np.array,然而,对于二维矩阵,numpy提供了专用的数据结构 np.mat 来表示。
np.array与np.mat 的区别在于:
1)np.array更具通用性,np.mat只适用于二维矩阵,维数超过2以后,np.mat就不适用了。
2)np.mat可以从字符串或列表中生成;np.array只能从列表中生成。
a = np.mat('4,3;2,1')
b = np.mat('1 2;3 4')
c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]])
3)np.array生成的数组,用 np.dot() 表示矩阵乘积,* 或 np.multiply() 表示点乘;而np.mat生成数组,* 和 np.dot() 的作用相同,点乘只能用np.multiply()。
4) np.array和np.mat生成的矩阵转置均可以用 a.T 表示;但是在矩阵求逆操作中,np.array 生成的矩阵一般用 np.linalg.inv(a) ;而np.mat生成的矩阵可以采用 a.I 这样的简单形式。
5)np.array和np.mat生成的矩阵可以相互转换:
np.asmatrix(a)
np.asarray(a)
机器学习中,大多还是使用np.array创建矩阵,主要是因为数组才是NumPy的标准数据结构,绝大多数操作都是基于数组的。
2.2 选择元素
NumPy数组的索引编号是从0开始的,可以通过下标直接访问向量或矩阵中的元素。此外,NumPy还提供了切片操作。这一块内容我在前面的博文中已经介绍过了(点此参考),在这里就不多说了。
2.3 展示属性
可以使用shape、size、ndim等函数展示一个矩阵的形状、大小和维数:
import numpy as np
m = np.array([[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]])
print(m.shape) # (3,5)
print(m.size) # 15
print(m.ndim) # 2
2.4 基础计算
在NumPy中可以使用max、min 查找数组中的最大值或最小值,并通过mean、var 和 std 计算数组的平均值、方差和标准差:
import numpy as np
m = np.array([[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]])
print(np.mean(m)) # 12.0
print(np.var(m)) # 68.66666666666667
print(np.std(m)) # 8.286535263104035
reshape函数可以在不改变元素值的前提下改变一个数组的形状:
import numpy as np
matrix = np.array([[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]])
print(matrix.shape) # (3,4)
print(matrix.size) # 12
# reshape(a, b): 将已有数组转化为a行b列的数组形式
matrix_1=matrix.reshape(4,3)
print(matrix_1)
# [[ 0 1 2]
# [ 3 10 11]
# [12 13 20]
# [21 22 23]]
matrix_2=matrix.reshape(2,6)
print(matrix_2)
#[[ 0 1 2 3 10 11]
#[12 13 20 21 22 23]]
# reshape中能传入参数值-1,只需指定行数或列数
matrix_3=matrix.reshape(6,-1) #表示只指定行数为6,列数根据自动生成
print(matrix_3)
# [[ 0 1]
# [ 2 3]
# [10 11]
# [12 13]
# [20 21]
# [22 23]]
可以用 flatten() 展开一个矩阵,也就是将多维数组转换成一个一维数组,该功能也可以用 matrix.reshape(1,-1) 实现。
matrix_4 = matrix.flatten()
print(matrix_4)
#[ 0 1 2 3 10 11 12 13 20 21 22 23]
通过NumPy还可以非常方便的计算矩阵的秩(np.linalg.matrix_rank)、计算行列式(np.linalg.det)、获取矩阵的对角线元素(diagonal())、计算矩阵的迹(trace())、计算特征值和特征向量(np.linalg.eig)等:
import numpy as np
matrix=np.array([[1,1,1],[1,1,10],[1,1,15]])
#计算矩阵的秩
print(np.linalg.matrix_rank(matrix)) # 2
#计算行列式
print(np.linalg.det(matrix)) #0.0
#获取对角线元素
print(matrix.diagonal()) #[ 1 1 15]
#获取对角线向上偏移量为1的对角线元素
print(matrix.diagonal(offset=1)) #[ 1 10]
#获取对角线向下偏移量为1的对角线元素
print(matrix.diagonal(offset=-1)) #[1 1]
#计算矩阵的迹(对角线元素之和)
print(matrix.trace()) #17
print(sum(matrix.diagonal())) #17
#计算特征值和特征向量
eig_values,eig_vectors=np.linalg.eig(matrix)
print(eig_values)
#[1.57972598e+01 1.20274024e+00 4.17207245e-17]
print(eig_vectors)
# [[ 9.35154454e-02 9.54818342e-01 7.07106781e-01]
# [ 5.61805577e-01 2.83317939e-01 -7.07106781e-01]
# [ 8.21966761e-01 -8.97378394e-02 -4.99981379e-17]]
PS,矩阵的奇异值分解采用np.linalg.svd(matrix),想了解特征值分解和奇异值分解的童鞋可以点击这里,同时也可以查看我之前的博文。
向量或矩阵的转置和方阵的求逆运算可以通过下面的命令非常便捷地实现:
#转置
matrix.T
#方阵的逆
np.linalg.inv(matrix)
矩阵间的运算包括矩阵的相加、相减和矩阵的乘法:
import numpy as np
# 创建矩阵
matrix_A = np.array([[1, 2], [3, 4]])
matrix_B = np.array([[5, 6], [7, 8]])
#矩阵相加(np.add)
print(np.add(matrix_A,matrix_B))
# [[ 6 8]
# [10 12]]
#矩阵相减(np.subtract)
print(np.subtract(matrix_A,matrix_B))
# [[-4 -4]
# [-4 -4]]
# 矩阵相乘(np.dot或@)
print(np.dot(matrix_A, matrix_B))
print(matrix_A @ matrix_B)
# [[19 22]
# [43 50]]
# 两个矩阵对应元素相乘(*)
print(matrix_A * matrix_B)
# [[ 5 12]
# [21 32]]
关于矩阵的基础计算就讲到这里了~
参考:
- 《python机器学习手册》,Chris Albon著
- https://www.jianshu.com/p/fab721cb5cb1
- https://www.cnblogs.com/cymwill/p/9937850.html