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均匀分布的随机数