Numpy模块
一、Numpy库的作用
区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。
二、为什么用Numpy
lis1 = [1, 2, 3] # 向量
lis2 = [4, 5, 6] # 向量
# 要得出[4,10,18]的过程有些复杂
lis = []
for i in range(len(lis1)):
lis.append(lis1[i] * lis2[i])
print(lis)
#[4,10,18]
三、创建Numpy数组
numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。
#解决以上问题 import numpy as np arr1 = np.array([1,2,3]) arr2 = np.array([4,5,6]) print(arr1*arr2) # [ 4 10 18]
# numpy数组 arr = np.array([1, 2, 3]) print(arr) # 一维的numpy数组 arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print(arr2) # 二维的numpy数组(一般就是二维) arr3 = np.array([[[1, 2, 3], [4, 5, 6]],[[1, 2, 3], [4, 5, 6]],[[1, 2, 3], [4, 5, 6]]]) print(arr3) # 三维的不使用numpy模块,使用tensorflow/pytorch模块
四、Numpy数组常用属性
# 属性(可以记)
'''
T 数组的转置(对高维数组而言)
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
astype 类型转换
'''
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2) # 二维的numpy数组(一般就是二维)
#[[1 2 3]
# [4 5 6]]
print(arr2.T) # 行与列互换
print(arr2.transpose()) # 行与列互换
#[[1 4]
# [2 5]
# [3 6]]
print(arr2.dtype) # python中的数据类型
#int32
print(arr2.astype(np.float64).dtype)
#float64
print(arr2.size)
#6
print(arr2.shape)
#(2, 3)
print(arr2.ndim)
#2
#切片 arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print(arr2) # 二维的numpy数组(一般就是二维) #[[1 2 3] # [4 5 6]] print(arr2[:, :]) #[[1 2 3] # [4 5 6]] print(arr2[0:1, :]) #[[1 2 3]] print(arr2[0:1, 0:1]) #[[1]] print(arr2[0, :]) #[1 2 3] print(arr2[0, 0],type(arr2[0, 0])) #1 <class 'numpy.int32'> print(arr2[0, [0,2]]) #[1 3] print(arr2[0, 0] + 1) #2
# 修改值 lis = [1,2,3] lis[0] = 2 print(lis) #[2, 2, 3] arr2 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr2) # 二维的numpy数组(一般就是二维) #[[1 2 3] # [4 5 6]] arr2[0, :] = 0 print(arr2) #[[0 0 0] # [4 5 6]] arr2[1, 1] = 1 print(arr2) #[[0 0 0] # [4 1 6]] arr2[arr2 < 3] = 3 # 布尔取值 print(arr2) #[[3 3 3] # [4 3 6]]
#合并 arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr1) #[[1 2 3] # [4 5 6]] arr2 = np.array([[7, 8, 9], [10, 11, 12]]) # 可变数据类型 print(arr2) #[[ 7 8 9] # [10 11 12]] print(np.hstack((arr1,arr2))) # 行合并 #[[ 1 2 3 7 8 9] # [ 4 5 6 10 11 12]] print(np.vstack((arr1,arr2))) # 列合并 #[[ 1 2 3] # [ 4 5 6] # [ 7 8 9] # [10 11 12]] print(np.concatenate((arr1, arr2))) # 默认列合并 #[[ 1 2 3] # [ 4 5 6] # [ 7 8 9] # [10 11 12]] print(np.concatenate((arr1, arr2),axis=1)) # 1表示行;0表示列 #[[ 1 2 3 7 8 9] # [ 4 5 6 10 11 12]]
# 通过函数创建numpy数组 arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr1) #[[1 2 3] # [4 5 6]] print(np.zeros((5, 5))) #[[0. 0. 0. 0. 0.] # [0. 0. 0. 0. 0.] # [0. 0. 0. 0. 0.] # [0. 0. 0. 0. 0.] # [0. 0. 0. 0. 0.]] print(np.ones((5, 5)) * 100) #[[100. 100. 100. 100. 100.] # [100. 100. 100. 100. 100.] # [100. 100. 100. 100. 100.] # [100. 100. 100. 100. 100.] # [100. 100. 100. 100. 100.]] print(np.eye(5)) #单位矩阵 #[[1. 0. 0. 0. 0.] # [0. 1. 0. 0. 0.] # [0. 0. 1. 0. 0.] # [0. 0. 0. 1. 0.] # [0. 0. 0. 0. 1.]] print(np.arange(1,10,2)) # 生成一维的 #[1 3 5 7 9] print(np.linspace(0,20,10)) # 平均分成10份 # 构造x坐标轴的值 #[ 0. 2.22222222 4.44444444 6.66666667 8.88888889 11.11111111 13.33333333 15.55555556 17.77777778 20. ] arr = np.zeros((5, 5)) print(arr.reshape((1,25))) #[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
# 数组运算 arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr1) #[[1 2 3] # [4 5 6]] arr2 = np.array([[7, 8, 9], [10, 11, 12]]) # 可变数据类型 print(arr2) #[[ 7 8 9] # [10 11 12]] # +-*/ // % ** print(arr1*arr2) #[[ 7 16 27] # [40 55 72]] print(arr1+arr2) #[[ 8 10 12] # [14 16 18]]
# 运算函数 arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr1) #[[1 2 3] # [4 5 6]] print(np.sin(arr1)) #[[ 0.84147098 0.90929743 0.14112001] # [-0.7568025 -0.95892427 -0.2794155 ]] print(np.cos(arr1)) #[[ 0.54030231 -0.41614684 -0.9899925 ] # [-0.65364362 0.28366219 0.96017029]] print(np.sqrt(arr1)) #[[1. 1.41421356 1.73205081] # [2. 2.23606798 2.44948974]] print(np.exp(arr1)) #[[ 2.71828183 7.3890561 20.08553692] # [ 54.59815003 148.4131591 403.42879349]]
# 额外补充(了解) arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 arr2 = np.array([[7, 8, 9], [10, 11, 12]]) # 可变数据类型 # m*n × n*m = m*m print(np.dot(arr1,arr2.T)) #[[ 50 68] # [122 167]] # 求逆 arr1 = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]]) print(np.linalg.inv(arr1)) #[[ 0.5 -1. 0.5 ] # [-3. 3. -1. ] # [ 2.16666667 -1.66666667 0.5 ]] # numpy的数学方法(了解) arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 可变数据类型 print(arr1.var()) #2.9166666666666665 print(arr1.std()) #1.707825127659933 print(arr1.mean()) #3.5 print(arr1.cumsum()) # 累加和 #[ 1 3 6 10 15 21]
# numpy随机数(了解) print(np.random.rand(3,4)) #[[0.52306236 0.81121148 0.69762517 0.91050912] # [0.95161962 0.02723011 0.41058941 0.62561587] # [0.33066979 0.89355263 0.50560677 0.46214671]] print(np.random.randint(1,10,(3,4))) # 最小值1,最大值10,3*4 #[[7 7 2 5] # [3 9 8 3] # [9 4 5 8]] print(np.random.choice([1,2,3,4,5],3)) #[5 1 4] arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) np.random.shuffle(arr1) print(arr1) #[[1 2 3] # [4 5 6] # [7 8 9]]
# 随机数种子 # 所有的随机数是按照随机数中子生成的 import time # 重点 np.random.seed(int(time.time())) np.random.seed(1) arr1 = np.random.rand(3,4) # 可变数据类型 print(arr1) #[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01] # [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01] # [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]] rs = np.random.RandomState(1) print(rs.rand(3,4)) #[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01] # [1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01] # [3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]