Python的NumPy模块学习要点

时间:2022-11-12 22:23:48

Python的NumPy模块学习要点
Python的NumPy模块学习要点

python

1. Python内置的数组功能

Python从3.3版本之后支持内置数组以实现需要数组完成的功能。但是这个功能依然远不如numpy好用。

在这里我还是要推荐下我自己建的Python开发学习群:483546416,都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2017最新的Python零基础资料和Python进阶教程,欢迎进加入

import array
L=list(range(10))
A=array.array('i',L)

示例中的’i’是数组的类型。在实践中,一般使用NumPy处理数组,习惯性的操作实践是

import numpy as np

2. 使用NumPy创建数组

使用numpy创建数组基本语法如下,其中dtype参数如果省略,则numpy根据输入的内容自行推断参数类型。

np.array([1,4,2,3,6],dtype=float32)
np.zeros(10,dtype=int) #整形数组,初始化为0np.ones((3,5),type=float)#浮点型3*5二维数组,初始化1np.full((3,5),3.14)#初始化为3.14的数组np.linspace(0,1,5)#均匀分布[0,0.25,0.5,0.75,1]np.random.random((3,3))#随机数数组np.random.normal(0,1,(3,3))#平均值为0,方差为1,正态分布np.random.randint(0,10,(3,3))#0,10之间随机整数数组np.eye(3)#3x3单位矩阵np.empty(3)#未初始化的空矩阵,内存中的任意值

3. NumPy数组基础

随机数种子

如果使用的是随机数组,那么每次都出现随机值在测试时会比较麻烦,可以使用seed函数指定随机数种子,以确保随机数的一致性(正式程序中要去掉)

np.random.seed(0)
np.random.randint(10,size=6)#一维数组

数组属性

每个数组都有以下属性

  • ndim,维度
  • shape,每个维度的大小
  • size,总的大小
    数组索引
  • ar[3],ar[-3],正向,反向索引
  • ar2[2,-1],多维数组用逗号分隔
  • x[start:stop:step],数组切片,默认start为0,stop为总的大小,step为1
  • 一个冒号表示空切片,可以用来取得数组单个行或者列,比如ar3[:,0],取得数组第一列。也可以省略空切片。
    数组复制
    直接使用等号时,使用的是非副本复制,即修改了新变量之后原变量也会被修改,这样的好处是可以从大的数组中提取一小部分进行修改,但缺点是无法生成与原数组无关的数组。如果要产生副本,需要使用copy函数。
    比如
    x2_sup_copy=x2[:2,:2].copy()#抽取数组行列前2个元素生成新数组
    数组变形
    数组变形最常用的命令是reshape()函数.也可以在切片中直接使用newaxis关键字。
    grid=np.arrange(1,10).reshape((3,3,))#把1维数组1-9放入3x3的矩阵中x=np.array([1,2,3]) #示例数组x.reshape((1,3))#通过变形获得行向量([[1,2,3]])x[np.newaxis,:]#通过newaxis关键词获得行向量
    数组拼接和分割
    使用concatenate,vstack或者hstack函数
    x=np.array(1,2,3])
    y=np.array([4,5,6])
    z=np.array([7,8,9])
    np.contatenate([x,y,z])#拼接多个数组#对于多维数组,contatenate函数可以增加axis参数选择从哪个轴拼接
    vstack和hstack用法与此类似,另外还有dstack可以通过第三个轴拼接
    grid=np.array([[9,8,7],[6,5,4]])
    x=np.array([1,2,3])
    y=np.array([[99],[98]])
    np.vstack([x,grid]) 
    # 输出 array([[1,2,3],[9,8,7],[6,5,4]])np.hstack([grid,y])#输出 array([[9,8,7,99],[6,5,4,98]])
    与数组拼接对应,对数组进行分割时,可以采用split,hsplit和vsplit,dsplite函数实现

    4.NumPy数组计算

    通用函数
  • NumPy可以采用Python原生计算符+ - / // * %进行向量计算,这被称为NumPy的通用函数。方便计算也方便使用。也可以使用abs(x),或者sin,cos,tan等函数进行绝对值和三角函数计算。或者使用e^x,2^x或者ln(x),log2(x),log10(x)进行指数和对数计算。
  • 对于通用函数,可以增加out参数来指定输出位置,比如
    np.multiply(x,5,out=y) # x乘以5,输出保存在y中
  • 采用reduce方法和通用函数聚合,可以获得对整个数组进行操作的结果。np.multiply.reduce(x)获得整个数组x所有元素的乘积,np.add.reduce(x)获得所有元素的和,np.add.accumulate可以获得每次计算的中间结果。sum,prod,cumsum,cumpod等函数也可以实现以上reduce功能。
  • min,max用来求最大值最小值,sum求和,prod求积,mean平均值,std标准差,var方差,argmin,argmax最大最小值索引,median中位数,percentile基于元素排序的统计值,any、all验证任意一个(所有元素)是否为真。
    其他通用函数,在scipy.special中包含了其他常用的特殊函数功能,可以查阅相关文档。
    NumPy数组广播
    简单来说,广播就是允许不同维数,不同大小的数组之间进行运算操作。
    广播规则:
    1. 如果两个数组维度数不同,小维度数组形状会在最左边补1
    1. 如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状。
    1. 如果两个数组的形状在任何一个维度上都不匹配而且没有任何一个维度为1,那么会引发异常
      NumPy数组比较、掩码和布尔逻辑
      可以直接使用>,<,=,!=等操作数组,来得到需要的值。例如:
      x=np.array[1,2,3,4,5,6,7,8]
      x<3 # [True,True...]np.count_nonzero(x<6) #5np.sum(x<6)
      np.any(x>6)#Truenp.all(x>6)#Falsenp.sum((x<4)&&(x>6))#也可以进行布尔运算
      i花式索引
      可以通过数组来索引数组。生成的数组和索引数组一致,而不是和被索引的数组一致。
      也可以和切片等功能结合起来实现更复杂的功能。
      数组排序
      排序的常用算法:插入排序,选择排序,归并排序,快速排序,冒泡排序等。
      在NumPy中可以使用sort和argsort进行快速排序。其中,argsort返回的是元是数组排序好的索引值。如果只希望找到最小的K个值进行分割,也可以使用partition函数。
      np.partition(x,3) #x是要分割的数组,分割后左边3个是最小的3个值,右边是原来其他值随意排列
      结构化数组
      结构化数组提供一种类似C语言的结构数据类型,用于存储数据,便于查询使用。
      ```python
      x=np.zeros(4,dtype=int)
      x=np.zeros(4,dtype=(‘names’:(‘username’,’age’,’weight’),’formats’:(‘U10’,’i4’,’f8’)))

      也可以采用下面元组的方式赋值

      np.dtype([(‘username’:’S10’),(‘age’,’i4’),(‘weight’,’f8’)])
      y=np.zeros(1,dtype=x)#更高级的结构化数组用法