人工智能之Python系列:Numpy库

一、引言

NumPy库是用于科学计算的一个开源Python扩充程序库,是其他数据分析包的基础包,它为Python提供了高性能数组和矩阵运算处理能力。

二、ndarray多维数组

ndarray对象是一个快速而灵活的数据集容器。主要讲解ndarray多维数组的创建方法、数组属性和数组的简单操作等。

2.1 创建ndarray数组

通过Numpy库的array函数,即可创建ndarray数组。NumPy库能将序列数据(列表、元组、数组或其他序列类型)转换为ndarray数组。如图所示:
在这里插入图片描述
对于多维数组的创建,使用嵌套序列数据即可完成,如图所示:
在这里插入图片描述
通常来说,ndarray是一个通用的同构数据容器,即其中的所有元素都需要是相同的类型。当创建好一个ndarray数组时,同时会在内存中存储ndarray的shape和dtype。shape是ndarray维度大小的元组,dtype是解释说明ndarray数据类型的对象,如图所示:
在这里插入图片描述
Δ注意:也可以通过显示说明,给数组指定数据类型。

除了可以使用np.array创建数组外,NumPy库还有一些函数可创建一些特殊的数组。

  1. zeros函数
    zeros函数可以创建指定长度或形状的全0数组。如图:
    在这里插入图片描述
  2. ones函数
    ones函数可以创建指定长度或形状的全1数组。如图:
    在这里插入图片描述
  3. empty函数
    empty函数可以创建一个没有具体值得数组(即垃圾值),如图:
    在这里插入图片描述
  4. arange函数
    arange函数类似于Python的内置函数range,但是arange函数主要用于创建数组,如图:
    在这里插入图片描述

更多的数组创建函数如下表:

函数使用说明
arange类似于内置的range函数,用于创建数组
ones创建指定长度或形状的全1数组
ones_like以另一个数组为参考,根据其形状的dtype创建全1数组
zeros、zeros_like类似于ones、ones_like,创建全0数组
empty、empty_like同上、创建没有具体指的数
eye、identity创建正方形的N*N单位举证

one_like函数用法,one_like函数可以根据传入的数组形状和dtype创建全1数组:
在这里插入图片描述

2.2 ndarray对象属性

Numpy创建的ndarray对象的属性,如表:

属性使用说明
.ndim秩,即数据轴的个数
.shape数组的维度
.size元素的总个数
.dtype数据的类型
.itemsize数组中每个元素的字节大小

2.3 ndarray数据类型

在创建数组时,NumPy会为新建的数组推断出一个合适的数据类型。同样,也可以通过dtype给创建的数组指定数据类型。
在这里插入图片描述
对于创建好的ndarray,可以通过astype方法进行数据类型的转换。如图
在这里插入图片描述
Δ注意:np.float64和‘float64’都可以进行操作
如果将浮点数转换为整数,并不会使用四舍五入的方式来转换,而是元素的小数部分都会被截断。
如果数组时字符串类型且全为数字的话,也可以通过astype方法将其转换为数值类型。
但如果字符串中有字符时,转换就会报错。
astype方法也可以通过另外一个数组的dtype进行转换,如图:
在这里插入图片描述
astype方法会创建一个新的数组,并不会改变原有数组的数据类型,如图:
在这里插入图片描述

2.4 数组变换

  1. 数组重塑
    对于定义好的数组,可以通过reshape方法改变其数据维度。传入的参数为新维度的元组,如图:
    在这里插入图片描述
    reshape的参数中的一维参数可以设置为-1,表示数组的维数可以通过数据本身来推断,如图:
    在这里插入图片描述
    与reshape相反的方法是数据散开(ravel)数据或扁平化(flatten),如图:
    在这里插入图片描述
    Δ注意:数据重塑不会改变原数组。
  2. 数组合并
    数组合并用于几个数组间的操作,concatenate方法通过指定轴方向,将多个数组合并在一起,如图:
    在这里插入图片描述
    此外,NumPy中提供了几个比较简单易懂的方法,也可以进行数组合并,如vstack和hstack,如图:
    在这里插入图片描述
  3. 数组拆分
    数组拆分是数组合并的相反操作,通过split方法可以将数组拆分为多个数组,如图:
    在这里插入图片描述
  4. 数组转置和轴对换
    转置是数组重塑的一种特殊形式,可以通过transpose方法进行转置。transpose方法需要传入轴编号组成的元组,这样就完成了数组的转置。如图:
    在这里插入图片描述
    除了使用transpose方法外,数组有着T属性,可以用于数组的转置,如图:
    在这里插入图片描述
    ndarray的swapaxes方法用于轴对换,如图:
    在这里插入图片描述

2.5 NumPy的随机数函数

在numpy.random模块中,提供可多种随机数生成函数。

函数使用说明
rand产生均匀分布的样本值
randint给定范围内取随机整数
randn产生正态分布的样本值
seed随机数种子
permutation对一个序列随机排序,不改变原数组
shuffle对一个序列随机排序,改变原数组
uniform(low,high,size)产生具有均匀分布的数组,low表示起始值,high表示结束值,size表示形状
normal(loc,scale,size)产生具有正态分布的数组,loc表示均值,scale表示标准差
poisson(lam,size)产生具有泊松分布的数组,lam表示随机事件发生率

三、数组的索引和切片

在数据分析中常需要选取符合条件的数据。

3.1 数组的索引

一维数组的索引类似Python列表
在这里插入图片描述
从代码来看,数组的切片返回的是原始数组的视图。简单地说,视图就是原始数组的表现形式,切片操作并不会产生新数据,这意味着在视图上的操作都会使原数组发生改变。
在这里插入图片描述
Δ注意:数组的切片和索引返回都是原始数组的视图。

如果需要的并非视图而是要复制数据,则可以通过copy方法来实现,如图:
在这里插入图片描述
二维、多维与一维类似。

3.2 数组的切片

一维数组的切片同样类似于Python列表,如图:
在这里插入图片描述
多维数组的切片是按照轴方向进行的,当在中括号中输入一个参数时,数组就会按照0轴(也就是第一轴)方向进行切片,如图
在这里插入图片描述
通过传入多个参数(可以是整数索引和切片),即可完成任意数据的获取,如图:
在这里插入图片描述

3.3 布尔型索引

首先创建两个数组,如图
在这里插入图片描述
如果每个水果对应datas数组中的每一行,我们要选取‘pear’对应的datas的行,这时就需要用到布尔选择器,如图
在这里插入图片描述
Δ注意:布尔型数组的长度必须和被索引的轴长度一致。
既然可以使用布尔选择,那么也同样适用于不等号(!=)、负号(-)、和(&)、或(|)。如图:
在这里插入图片描述
此外,布尔数组也可以结合切片和索引来使用,如图
在这里插入图片描述
通过以下代码可以完成datas数组中的0值替换为1值,如图
在这里插入图片描述

3.4 花式索引

花式索引是NumPy中的术语,它可以通过整数列表或数组进行索引,也可以使用np.ix_函数完成同样的操作,如图:
在这里插入图片描述

四、数组的运算

数组的运算支持向量化运算,将本来需要在Python级别进行的循环,放到C语言的运算中,明显提高了程序的运算速度。

4.1 数组和标量间的运算

数组之所以很强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化。相同维度的数组的算术运算都可以直接应用到元素中,也就是元素级运算。
在这里插入图片描述

4.2 通用函数

通用函数(ufunc)是一种对数组中的数据执行元素级运算的函数,用法也很简单。例如:通常abs函数求绝对值,square函数求平方。以上函数都是传入一个数组,所以这些函数都是一元函数。有一些函数需要传入两个数组并返回一个数组,这些函数被称为二元函数。例如:add函数用于两个数组的相加,minimum函数可以计算元素最小值。有些通用函数还可以返回两个数组,例如modf函数,可以返回数组元素的小数和整数部分。

Δ注意:更多通用函数的用法,可以去NumPy官网http://www.numpy.org/查阅

4.3 条件逻辑运算

首先创建3个数组,如图
在这里插入图片描述
如果需要通过cond的值来选取arr1和arr2的值,当cond为True时,选取arr1的值,否则选择arr2的值,那么可以通过if语句判断来实现,如图:
在这里插入图片描述
但这种方法存在连个问题:第一,对大规模数组处理速度不是很快;第二,无法用于多维数组。若使用NumPy的where函数则可以解决这两个问题,如图:
在这里插入图片描述
where函数中的第二个和第三个参数可以是标量。在数据分析中,经常需要通过一些条件将数组进行处理。例如,新建一个随机符合正态分布的数组,通过数据处理将正值替换为1,负值替换为-1,如图:
在这里插入图片描述
使用elif函数可以进行多条件的判断。np.where函数通过嵌套的where表达式也可以完成同样的功能,如图:
在这里插入图片描述

4.4 统计运算

NumPy库支持对整个数组或按指定轴向的数据进行统计计算。例如:sum函数用于求和,mean函数用于求算术平均值,std函数用于求标准差,如图:
在这里插入图片描述
上面的这些函数也可以传入axis参数,用于计算指定轴方向的统计值,如图:
在这里插入图片描述
cumsum和cumpod方法会产生计算结果组成的数组,如图:
在这里插入图片描述
基本数组的统计方法如表:

方法使用说明
sum求和
mean算数平均值
std、var标准差和方差
min、max最小值和最大值
argmin、argmax最小和最大元素的索引
cumsum所有元素的累加值
cumprod所有元素的累计积

4.5 布尔型数组运算

对于布尔型数组,其布尔值会被强制转换为1(True)和0(False),如图:
在这里插入图片描述
另外,还有两个方法any和all也可以用于布尔型数组运算。any方法用于测试数组中是否存在一个或多个True;all方法用于检查数组中的所有值是否为True。如图:
在这里插入图片描述

4.6 排序

与Python列表类似,NumPy数组也可以通过sort方法进行排序,如图:
在这里插入图片描述
对于多维数组,可以通过指定轴方向进行排序,如图:
在这里插入图片描述

4.7 集合运算

NumPy库提供了针对一维数组的基本集合运算。在数据分析中,常使用np.unique方法来找出数组中的唯一值,如图:
在这里插入图片描述
Δ注意:对唯一值进行了排序
np.in1d方法用于测试几个数组中是否包含相同的值,返回一个布尔值数组,如图:
在这里插入图片描述
数组的集合运算如表:

方法使用说明
unique(x)唯一值
intersect1d(x,y)公共元素
union1d(x,y)并集

4.8 线性代数

前面的运算时元素级的,数组相乘的结果是各对应元素的积组成的数组。而对于矩阵而言,需要求的是点积,这里Numpy库提供了用于矩阵乘法的dot函数。如图:
在这里插入图片描述
对于更多的矩阵计算,可通过Numpy库的linalg模块来完成。
如图,为计算矩阵的行列式:
在这里插入图片描述
Δ注意:更多的矩阵运算说明可查看linalg帮助。

五、数组的存取

5.1 数组的存储

通过np.savetxt方法可以对数组进行存储,具体实现如图:
在这里插入图片描述

5.2 数组的读取

对于存储的文件,可以通过np.loadtxt方法进行读取,并将其加载到一个数组中,如图:
在这里插入图片描述

结束

补充:

①轴向问题

举例以下数据:
在这里插入图片描述
沿横轴分割数组:
在这里插入图片描述
沿纵轴分割数组:
在这里插入图片描述
说明:从哪个轴入手,就相当于切割该轴。例如:以行为轴,就是切割行生成列数据。

所以以下例子就好理解了。
在这里插入图片描述
返回每列最大值:
在这里插入图片描述
返回每行最小值:
在这里插入图片描述

②找出两个一维数组中相同的元素

在这里插入图片描述

③标准化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用 NumPy 计算变量直接的相关性系数:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值