【0825 | Day 22】Numpy模块
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]]