Python学习之numpy
Python学习之numpy
数组是Numpy库的核心数据结构。
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
数组的创建
# 创建数组的基本方式-向np.array传入一个列表
a = np.array([1,2,3])
b = np.array([[1,2,3],[4,5,6]])
# 索引数组中的数字
print(a[0])
print(b[0,0])
# 其他创建数组的方式如下
# np.zeros()
a = np.zeros(2)#创建一个长度为2的全0数组,向np.zeros()中传递的参数是一个表示数组形状(shape)的元组
print(a)
b = np.zeros((2,2))#创建一个长度为2*2的全0数组
print(b)
#np.ones()
a = np.ones(2) #创建一个长度为2的全1数组
print(a)
b = np.ones((2,2)) #创建一个长度为2*2的全1数组
print(b)
# np.full()
a = np.full(2,7) #创建一个长度为2的数组,每个元素都是7
print(a)
b = np.full((2,2),7) #创建一个长度为2*2的数组,每个元素都是7
print(b)
#np.arange()
a = np.arange(1,10,1) #创建一个数组,元素为1到9,步长为1
print(a)
b = np.arange(1,10,2) #创建一个数组,元素为1到9,步长为2
print(b)
# np.linspace()应用十分广泛,在可视化以及数值计算中都会用到,名字来源于“linear space”(线性空间),因为它在指定的范围内均匀地生成数值。
a = np.linspace(0,1,5) #创建一个数组,元素为0到1,共5个数
print(a)
# 在创建数组时,可以指定数据类型
a = np.array([1,2,3], dtype=float)
print(a)
b = np.array([1,2,3], dtype=np.int32)
print(b)
# 由于在现实应用中,二维数组(矩阵)最为常见,下面局里一个单位矩阵的例子
a = np.eye(2) # 创建一个2*2的单位矩阵
print(a)
b = np.eye(3) # 创建一个3*3的单位矩阵
print(b)
数组的索引与切片
# numpy中与list相似的索引与切片操作
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(a)
print("--------------------------")
b = a[:2,1:3] #取a的前两行,第2到第3列
print(b)
print("--------------------------")
c = a[0,1] #取a的第1行第2列
print(c)
print("--------------------------")
row_r1=a[1,:] #取a的第2行
print(row_r1)
print("--------------------------")
line = a[:,1] #取a的第2列
print(line)
# 从数组中选择满足特定条件的值
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(a[a<5]) #取出a中小于5的元素
print(a[a>=5]) #取出a中大于等于5的元素
print(a[a%2==0]) #取出a中所有偶数
print(a[a%2!=0]) #取出a中所有奇数
print("--------------------------")
# 筛选出满足条件的元素,并将其赋值为0
a[a<5]=0
print(a)
元素的添加删除与排序,数组的拼接与拆分
# 元素的添加删除
a = np.array([1,2,3])
a = np.append(a,4) #向数组a中添加元素4
print(a)
print("-----------------")
a = np.array([1,2,3],[4,5,6])
a = np.append(a,[[7,8,9]], axis=0) #向数组中添加一行
print(a)
print("-----------------")
a = np.append(a,[[10],[11],[12]], axis=1) #向数组中添加一列
a = np.delete(a,1,axis=0) #删除数组中第二行
a = np.delete(a,1,axis=1) #删除数组中第二列
a = np.insert(a,1,[1,2,3],axis=0) #在数组a中的第二行插入元素
a = np.insert(a,1,5,axis=1) #在数组a中的第二列插入元素
# 数组的拼接
a = np.array([[1,2],[3,4]])
b = np.array([5,6])
c = np.concatenate((a,b),axis=0) #在数组a的下方拼接数组a
d = np.array([[5],[6]])
e = np.concatenate((a,b),axis=1) #在数组a的右边拼接数组a,注意b和d数组的书写方式不同
# 数组的拆分
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
b = np.hsplit(a,2) #将数组a进行水平拆分,拆成2个数组
b = np.vsplit(a,2) #将数组a进行垂直拆分,拆成3个数组
注意:在数组拆分的过程中,使用np,vslit进行垂直拆分的时候,看上去是对数组进行了水平拆分,其实要堪称数组在内存中的存储形式,[[1,2,3,4],[5,6,7,8],[9,10,11,12]],进行垂直拆分就是3个数组,如果写成数学上的矩阵,就是“水平”拆分,其实是垂直拆分,要注意区别
# 数组的排序
a = np.array([3,2,1])
b = np.sort(a) #对数组a及进行(默认升序)排序
a = np.array([4,3,5],[1,2,1])
b = np.sort(a,axis=1) #按行排序
b = np.sort(a,axis=0) #按列排序
# 了解numpy数组的形状,大小,维度
a = np.array([[1,2,3],[4,5,6]])
print(a.shape) #数组a形状
print(a.size) #数组a的大小
print(a.ndim) #数组a维度 number of array dimensions
#Numpy数组的重塑 np.reshape()方法
a = np.array([[1,2,3],[4,5,6]])
b = np.reshape(3,2) #将数组a重塑为3行2列
c = np.reshape(6,1) #将数组a重塑为6行1列
d = np.reshape(1,6) #将数组a重塑为1行6列(二维)
e = np.reshape(6) #将数组a重塑为1行6列(一维)
# numpy数组维度的交换 np.transpose()方法
a = np.array([[1,2,3],[4,5,6]])
b = a.T #对数组a进行转置
#二维变一维 展平操作 np.flaten()
c = a.flatten() #将数组a变为一维数组
#一维变二维
d = c.reshape(2,3) #将数组c重塑为2行3列
#numpy数组的运算
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(a+b) #矩阵a与矩阵b的对应位置加法运算
print(a-b) #矩阵a与矩阵b的对应位置减法运算
print(a*b) #矩阵a与矩阵b的对应位置乘法运算,并非线性代数中的矩阵乘法
print(a/b) #矩阵a与矩阵b的对应位置除法运算
print(np.dot(a,b)) #线性代数中的矩阵乘法
print(a+1) #数组中每个元素+1
print(a*1) #数组中每个元素*1
# numpy数组的广播机制
# 广播机制:NumPy的广播机制允许在不同形状的数组之间进行算术运算,自动扩展较小的数组以匹配较大的数组形状
# 广播机制的规则:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的
#广播机制的核心规则
#维度对齐:从右向左按元素比较形状,不足的维度在左侧补1。
#兼容性检查:每个维度的大小必须满足以下之一:
# 相等
# 其中一个为1(该维度会被扩展)
# 广播机制的目的:是为了使两个数组的形状相同,以便进行数学运算
a = np.array([[1,2,3],[4,5,6]])
b= np.array([1,2,3]) #由于b是以为数组故其形状为(3,)表示三列,如果b是二维数组的话则表示为(1,3)一行三列
print(b)
print(b.shape)
print(a.shape)
print(a+b)
#a的形状为(2,3),b的形状为(3,),则b的形状就会沿着维度为1的维度进行扩展,变成(1,3),再与a的形状进行匹配,最终两#个数组的形状变成(2,3),可进行加法运算
# 使用numpy数组进行数学运算
a = np.array([[1,2],[3,4]])
print(np.sum(a)) #计算数组a中所有元素的和
print(np.sum(a,axis=0)) #计算数组a中每一列的和
print(np.sum(a,axis=1)) #计算数组a中每一行的和
print(np.mean(a)) #计算数组a中所有元素的平均值
print(np.max(a)) #计算数组a中所有元素的最大值
print(np.max(a,axis=0)) #计算数组a中每一列的最大值
print(np.max(a,axis=1)) #计算数组a中每一行的最大值
#numpy中的数学函数
print(np.exp(a)) #计算数组a中每个元素的指数
print(np.log(a)) #计算数组a中每个元素的自然对数
print(np.sqrt(a)) #计算数组a中每个元素的平方根
print(np.sin(a)) #计算数组a中每个元素的正弦值
print(np.cos(a)) #计算数组a中每个元素的余弦值
print(np.tan(a)) #计算数组a中每个元素的正切值
# 使用numpy生成随机数
# 随机种子
np.random.seed(114514)
a = np.random.random(2) #生成一个长度为2的随机数组
b = np.random.random((2,2)) #生成一个长度为2*2的随机数组
c = np.random.randint(1,10,2) #生成一个长度为2的随机整数数组
d = np.random.randn(2) #生成一个长度为2的服从标准正态分布的随机数组 n:normal
e = np.random.uniform(0,1) #生成一个服从0到1均匀分布的随机数