NumPy数值计算基础(超详细的numpy使用方法)

NumPy数值计算基础

  • NumPy是在1995年诞生的Python库Numeric的基础上建立起来的,但真正促使NumPy的发行的是Python的SciPy库。但SciPy中并没有合适的类似于Numeric中的对于基础数据对象处理的功能。于是,SciPy的开发者将SciPy中的一部分和Numeric的设计思想结合,在2005年发行了NumPy。
  • NumPy是Python的一种开源的数值计算扩展库。它包含很多功能,如创建n维数组(矩阵)、对数组进行函数运算、数值积分等。 NumPy的诞生弥补了这些缺陷,它提供了两种基本的对象:
  • ndarray:是储存单一数据类型的多维数组。
  • ufunc:是一种能够对数组进行处理的函数。
  • NumPy常用的导入格式:import numpy as np

一、NumPy多维数组

1 创建数组对象

通常来说,ndarray是一个通用的同构数据容器,即其中的所有元素都需要相同的类型。利用array函数可创建ndarray数组。

(1)利用array函数创建数组对象

array函数的格式:np.array(object, dtype,ndmin)

array函数的主要参数及说明:

在这里插入图片描述

1import numpy as np 2data1 = [1,3,5,7] #列表 3w1 = np.array(data1) 4print('w1:',w1) 5data2 = (2,4,6,8) #元组 6w2 = np.array(data2) 7print('w2:',w2) 8data3 = [[1,2,3,4],[5,6,7,8]] #多维数组 9w3 = np.array(data3) 10print('w3:',w3)

在这里插入图片描述

(2)专门创建数组的函数

  • arange函数:创建等差一维数组
  • 格式:np.arange([start, ]stop, [step, ]dtype)

在这里插入图片描述
例:`

1warray = np.arange(10) 2print(warray) 3warray = np.arange(0,1,0.2) 4print(warray)`

在这里插入图片描述

  • logspace函数:创建等比一维数组
  • 格式:np.logspace(start, stop, num, endpoint=True,base=10.0, dtype=None))

logspace的参数中,start, stop代表的是10的幂,默认基数base为10,第三个参数元素个数。

warray = np.logspace(0,1,5)#生成1-10间的5个元素的等比数列
print(warray)
在这里插入图片描述

  • zeros函数:创建指定长度或形状的全0数组
  • 格式:np.zeros(shape, dtype=float, order=‘C’)
  • ones函数:创建指定长度或形状的全1数组
  • 格式:np. ones(shape, dtype=None, order=‘C’)
  • diag函数:创建一个对角阵。
  • 格式:np.diag(v, k=0)

2 ndarray对象属性和数据转换

ndarray对象属性及其说明:

在这里插入图片描述
例:

1warray = np.array([[1,2,3],[4,5,6]]) 2print('秩为:',warray.ndim) 3print('形状为:',warray.shape) 4print('元素个数为:',warray.size)

在这里插入图片描述
设置数组的shape属性。

1warray.shape = 3,2 2print(warray)

在这里插入图片描述
数组的类型转换。

1arr1 = np.arange(6) 2print(arr1.dtype) 3arr2 = arr1.astype(np.float64) 4print(arr2.dtype)

在这里插入图片描述

3 生成随机数

在NumPy.random模块中,提供了多种随机数的生成函数。如randint函数生成指定范围的随机整数来构成指定形状的数组。

用法:
np.random.randint(low, high = None, size = None)

1arr = np.random.randint(100,200,size = (2,4)) 2print(arr)

在这里插入图片描述
random模块的常用随机数生成函数
在这里插入图片描述

4 数组变换

(1)数组重塑

与reshape相反的方法是数据散开(ravel)或数据扁平(flatten)。

1arr1 = np.arange(12).reshape(3,4) 2print("arr1:",arr1) 3arr2 = arr1.ravel() 4print("arr2:",arr2)

在这里插入图片描述
数据重塑不会改变原来的数组。

(2)数组合并

  • hstack函数:实现横向合并
  • vstack函数:实现纵向组合是利用vstack将数组纵向合并;
  • concatenate函数:可以实现数组的横向或纵向合并,参数axis=1时进行横向合并,axis=0时进行纵向合并。
1arr1 = np.arange(6).reshape(3,2) 2arr2 = arr1*2 3arr3 = np.hstack((arr1,arr2)) 4print(arr3)

在这里插入图片描述

(3)数组分割

与数组合并相反,hsplit函数、vsplit函数和split函数分别实现数组的横向、纵向和指定方向的分割。

1arr = np.arange(16).reshape(4,4) 2print('横向分割为:\n',np.hsplit(arr,2)) 3print('纵向组合为:\n',np.vsplit(arr,2))

在这里插入图片描述

(4)数组转置和轴对换

数组转置是数组重塑的一种特殊形式,可以通过transpose方法进行转置。

1arr = np.arange(6).reshape(3,2) 2print("矩阵:",arr) 3print("转置矩阵:",arr.transpose((1,0)))

在这里插入图片描述

除了使用transpose外,可以直接利用数组的T属性进行数组转置。

二、数组的索引和切片

1、一维数组的索引类似Python中的列表。

1arr = np.arange(10)#取1-10 2print(arr)#输出arr 3print(arr[2])#输出索引为2的元素 4print(arr[-1])#输出最后一个元素 5print(arr[1:4])#输出索引为1-3的元素

在这里插入图片描述

数组的切片返回的是原始数组的视图,不会产生新的数据,如果需要的并非视图而是要复制数据,则可以通过copy方法实现。

1arr1 = arr[-4:-1].copy() 2print(arr) 3print(arr1)

在这里插入图片描述

2、多维数组的索引和切片

  • 对于多维数组,它的每一个维度都有一个索引,各个维度的索引之间用逗号分隔。
  • 也可以使用整数函数和布尔值索引访问多维数组。
1arr = np.arange(12).reshape(3,4) 2print(arr) 3print(arr[0,1:3]) #索引第0行中第1列到第2列的元素 4print(arr[:,2]) #索引第2列元素 5print(arr[:1,:1]) #第0行第0列元素

在这里插入图片描述

1arr = np.arange(12).reshape(3,4) 2#从两个序列的对应位置取出两个整数来组成下标:arr[0,1],arr[1,3] 3print(arr) 4print('索引结果1:',arr[(0,1),(1,3)]) 5#索引第12行中第023列的元素 6print('索引结果2:',arr[1:2,(0,2,3)]) 7mask = np.array([1,0,1],dtype = np.bool) 8#mask是一个布尔数组,它索引第0,2行中第1列元素 9print('索引结果3:',arr[mask,1])

在这里插入图片描述

三、数组的运算

1、数组和标量间的运算

数组之所以很强大是因为不需要通过循环就可以完成批量计算.

1a = [1,2,3] 2b = [] 3for i in a: 4 b.append(i*i) 5 6print("b数组:",b) 7wy = np.array([1,2,3]) 8c= wy*2 9print("c数组:",c)

在这里插入图片描述

2、ufunc函数

ufunc函数全称为通用函数,是一种能够对数组中的所有元素进行操作的函数。对一个数组进行重复运算时,使用ufunc函数比使用math库中的函数效率要高很多。

  1. 常用的ufunc函数运算

常用的ufunc函数运算有四则运算、比较运算和逻辑运算。

1)四则运算:
加(+)、减(-)、乘(*)、除(/)、幂(**)。数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以形状必须相同。

2)比较运算:
>、<、==、>=、<=、!=。比较运算返回的结果是一个布尔数组,每个元素为每个数组对应元素的比较结果。

3)逻辑运算:
np.any函数表示逻辑“or”,np.all函数表示逻辑“and”, 运算结果返回布尔值。

1x = np.array([1,2,3]) 2y = np.array([4,5,6]) 3print("数组相加结果:",x+y) 4print("数组相减结果:",x-y) 5print("数组相乘结果:",x*y) 6print("数组幂运算结果:",x**y)

在这里插入图片描述

数组的比较运算。

1x = np.array([1,3,6]) 2y = np.array([2,3,4]) 3print('比较结果(<):',x<y) 4print('比较结果(>):',x>y) 5print('比较结果(==):',x==y) 6print('比较结果(>=):',x>=y) 7print('比较结果(!=):',x!=y)

在这里插入图片描述

  1. ufunc函数的广播机制

广播(broadcasting)是指不同形状的数组之间执行算术运算的方式。需要遵循4个原则:

1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在左边加1补齐。
2)如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度进行扩展,以匹配另一个数组的形状。
3)输出数组的shape是输入数组shape的各个轴上的最大值。
4)如果两个数组的形状在任何一个维度上都不匹配,并且没有任何一个维度等于1,则引发异常

1arr1 = np.array([[0,0,0],[1,1,1],[2,2,2]]) 2arr2 = np.array([1,2,3]) 3print("arr1:\n",arr1) 4print("arr2:\n",arr2) 5print("arr1+arr2:\n",arr1+arr2)

在这里插入图片描述

3、条件逻辑运算

在NumPy中可以利用基本的逻辑运算就可以实现数组的条件运算。

1arr1 = np.array([1,3,5,7]) 2arr2 = np.array([2,4,6,8]) 3cond = np.array([True,False,True,False]) 4result = [(x if c else y)for x,y,c in zip(arr1,arr2,cond)] 5result

在这里插入图片描述
这种方法对大规模数组处理效率不高,也无法用于多维数组。NumPy提供的where方法可以克服这些问题。

where的用法:
np.where(condition, x, y)
满足条件(condition),输出x,不满足则输出y。

np.where([[True,False], [True,True]],[[1,2], [3,4]],[[9,8], [7,6]]) 

在这里插入图片描述
条件为[[True,False], [True,False]],分别对应最后输出结果的四个值,运算时第一个值从[1,9]中选,因为条件为True,所以是选1。第二个值从[2,8]中选,因为条件为False,所以选8,后面以此类推。

1w = np.array([2,5,6,3,10]) 2np.where(w>4)

在这里插入图片描述
where中若只有条件 (condition),没有x和y,则输出满足条件元素的坐标。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

四、数组读写

1、读写二进制文件

  • NumPy提供了多种文件操作函数存取数组内容。
  • 文件存取的格式分为两类:二进制和文本。而二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。
  • NumPy中读写二进制文件的方法有:
    1. np.load(“文件名.npy")是从二进制文件中读取数据;
    1. np.save(“文件名[.npy]", arr) 是以二进制格式保存数据。

数组的读写:

1a = np.arange(1,13).reshape(3,4) 2print(a) 3np.save('arr.npy', a) # np.save("arr", a) 4c = np.load( 'arr.npy' ) 5print(c)

多个数组保存:

1a = np.array([[1,2,3],[4,5,6]]) 2b = np.arange(0, 1.0, 0.1) 3c = np.sin(b) #长度为10 4print(c) 5np.savez('result.npz', a, b, sin_array = c) 6r = np.load('result.npz') 7r['arr_0'] #数组a

2、读写文本文件

NumPy中读写文本文件的主要方法有:

  1. np.loadtxt("…/tmp/arr.txt",delimiter = “,”)把文件加载到一个二维数组中;
  2. np.savetxt("…/tmp/arr.txt", arr, fmt = “%d”, delimiter = “,”)是将数组写到某种分隔符隔开的文本文件中;
  3. np.genfromtxt("…/tmp/arr.txt", delimiter = “,”)是结构化数组和缺失数据。
np.loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’) 

在这里插入图片描述

五、NumPy中的数据统计与分析

1、排序

Sort函数对数据直接进行排序,调用改变原始数组,无返回值。
格式:numpy.sort(a, axis, kind, order)

参数说明:
在这里插入图片描述

  • np.argsort函数和np.lexsort函数根据一个或多个键值对数据集进行排序。
  • np.argsort(): 返回的是数组值从小到大的索引值;
  • np.lexsort(): 返回值是按照最后一个传入数据排序的结果。
1arr = np.array([7,9,5,2,9,4,3,1,4,3]) 2print('原数组:',arr) 3arr.sort() 4print('排序后:',arr)

在这里插入图片描述
带轴向参数的sort排序:

1arr = np.array([[4,2,9,5],[6,4,8,3],[1,6,2,4]]) 2print('原数组:\n',arr) 3arr.sort(axis = 1) #沿横向排序 4print('横向排序后:\n',arr)

在这里插入图片描述
使用argsort和lexsort函数,可以在给定一个或多个键时,得到一个由整数构成的索引数组,索引值表示数据在新的序列中的位置。

使用argsort函数进行排序

1arr = np.array([7,9,5,2,9,4,3,1,4,3]) 2print('原数组:',arr) 3print('排序后:',arr.argsort()) 4#返回值为数组排序后的下标排列

在这里插入图片描述
用lexsort排序

1a = np.array([7,2,1,4]) 2b = np.array([5,2,6,7]) 3c = np.array([5,2,4,6]) 4d = np.lexsort((a,b,c)) 5print('排序后:',list(zip(a[d],b[d],c[d])))

在这里插入图片描述

2、重复数据与去重

在NumPy中,对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的元组或者列表。

1names = np.array(['红色','蓝色','黄色','白色','红色']) 2print('原数组:',names) 3print('去重后的数组:',np.unique(names))

在这里插入图片描述
统计分析中有时也需要把一个数据重复若干次,使用tile和repeat函数即可实现此功能。

  • tile函数的格式:np.tile(A, reps)
    其中,参数A表示要重复的数组,reps表示重复次数。

  • repeat函数的格式:np.repeat(A, reps, axis = None)
    “a”: 是需要重复的数组元素,
    “repeats”: 是重复次数,
    “axis”: 指定沿着哪个轴进行重复,axis = 0表示按行进行元素重复;axis = 1表示按列进行元素重复。

使用tile函数实现数据重复

1arr = np.arange(5) 2print('原数组:',arr) 3wy = np.tile(arr,3) 4print('重复数据处理:\n',wy)

在这里插入图片描述
使用repeat函数实现数据重复

1arr = np.arange(5) 2print('原数组:',arr) 3wy = np.tile(arr,3) 4print('重复数据处理:\n',wy) 5arr2 = np.array([[1,2,3],[4,5,6]]) 6print('重复数据处理:\n',arr2.repeat(2,axis=0))

在这里插入图片描述

3、常用统计函数

NumPy中提供了很多用于统计分析的函数,常见的有sum、mean、std、var、min和max等。

几乎所有的统计函数在针对二维数组的时候需要注意轴的概念。

axis=0时表示沿着纵轴进行计算,axis=1时沿横轴进行计算。

1arr = np.arange(20).reshape(4,5) 2print('创建的数组:\n',arr) 3print('数组的和:',np.sum(arr)) 4print('数组纵轴的和:',np.sum(arr,axis = 0)) 5print('数组横轴的和:',np.sum(arr,axis = 1)) 6print('数组的均值:',np.mean(arr)) 7print('数组横轴的均值:',np.mean(arr,axis = 1)) 8print('数组的标准差:',np.std(arr)) 9print('数组横轴的标准差:',np.std(arr,axis = 1))

在这里插入图片描述

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''