当前课程知识点:计算思维与人工智能基础 > 第三部分:python基础 > 第八章:python生态库 > 8.8第三方库-numpy库(上)
下面我们给大家介绍三个关于科学计算的第三方库
分别是Numpy用于数组的计算
pandas用于数据结构的分析以及重建索引切片排序等等工作
matplotilb主要用于用图来展示数据
分别可以用折线图散点图饼状图等等
首先我们看一下numpy库的使用
在numpy库的使用里面呢
我们会常用的对象就是numpy的数组对象ndarray的对象
ndarray对象是存储单一数据类型的多维数组
那么如何创建他呢
我们可以通过三种方式第一种方式呢
创建一个序列通过把它转换成数组
那另外呢第二种方法就是我们可以有一些
专用的创建的序列和数组的方法来创建
第三种方法呢
我们是可以通过转换那么自定义函数或者是数组
或者是迭代器文件的方式它们转换成数组
首先我们来看第一种方式
那我们通过给array函数传递python的序列对象来创建数组
如果传递多层嵌套的序列呢将创建多维数组
我们来看当然使用numpy之前呢
我们必须也要通过import
导入我们的numpy这个第三方库
然后下面我们可以定义一个序列
然后我们通过numpy.array把这个序列转换成
一个NDarray这样的一个数组
如果我们给的数组是两维的或者是更多维的时候
他就可以转换成多维的数组
刚才这个方式呢创建序列后那是通过array函数
将它转换成数组的他这个效率上的不是很高
因此呢numpy提供了很多的专门用来创建数组的函数
比如说numpy.arange这样的一个函数
这个函数是可以产生一个序列的
那么第一个参数是开始第二参数终止值
最后一个步长
这个呢就是从0开始而终止值是1
步长是0.1那这个呢
通常的arange这个函数通常是左闭右开的
那么也就是不包括最后一个不包括一的
那么产生的是从零到零点九十个这样的数据
构成我们的一个arange数组
也可以通过其他的一些函数
比如说linspace这个函数也是零一
那么这个是这个linspace这个后面第三个参数
它是元素的个数那么他可以带一个参数
endpoint如果是true的话
那就包含我们的终止值
所以产生三个的话
他们就是零二零点五和一
那这样就构成了我们这个产生的numpy的数组
也可以通过zeros one empty这样的函数来创建
创建指定形状的数组的类型
比如说我们通过numpy.zeros 那么这个呢
给定数组的什么啊前面是给数组的大小
后面的各一个可以给定数组的类型
就会产生一个零是由四行三列组成的
这样的一个数组numpy.ones那么是产生的是
都是一的这样一个数组
同理我们前面的知识我们数组的大小后面是数组的类型
那么产生一个都是一组成的三行四列的这样一个数字。
那么第三种方式我们创造创建numpy数组
可以通过
那么它是可以通过从字符串文件迭代器和自定义函数来创建
我们首先来看这个fromstring那么这个第一个参数
我们就给一个字符串然后第二个参数是他的类型
那么第三个算是他的风格方式
那么是以空格分方式分隔
那么我们就可以把这个转换成一个array
那也可以我们给一个迭代器
那么迭代器的方式是这样子的
我们forx他可以从range5从0取到4
输出X平方这样的一个迭代器
把这个迭代器转换成numpy.的数组
我们通过fromiter来去转换那么它转换的数组呢
就是这样子的零一的平方
二的三的到四的平方这样的一个数组
我们还可以从指定的文件里面给定的数据
来转换成我们的array数组
那么这个呢是给定了这样那个文件
文件里面的内容的就是指有123456
分隔符是用逗号分隔的
也可以通过这样的fromfile把它转换成我们的array
另外一种方式呢
是我们给定一个函数
我们定义了个自定义函数func那么返回的结果呢
就是我们给定的值与4的膜加1
他们通过numpy.
应用这个函数后面这个参数呢是我们要输出的
数组的元素的个数那么是10
那么这个参数也要用它这个里面的取的时候
是从零到九个那么零到九个
那么分别于4的膜然后加1
我们得到的这个结果
就是我们有十个元素组成的这个数组
那还可以呢我们通过lambda函数来建数组
那像我们这样给一个lambda函数i j
结果输出是I与J是否相等
那么数组的大小呢
是33类型是整形所以呢这样的话通过这个函数
因为这个关系表达式我们可以看得到
所以他的结果是一个得到array是一个true from
也就是我们的布尔类型的
那么需要说明的我们这里面可以通过数组名称点dtype
来获得数组元素的类型
通过点shape来获得它的大小也可以通过
reshape来去修改我们的数组的形状
我们可以看到这是我们刚才生成的一个
是一个数组是什么类型什么大小
我们可以通过点shape和点dtype来去获得
他这个数组类型是布尔类型的
数组的大小呢可以通过点shape去获
那么reshape就是我们可以看
刚才我们输出这个数组三行三列的
我们也可以把它转换成一行九列的
那么这个是可以转换成是这样的数组
我们可以看他就把他这个把我们三乘三的这个数组
把它转换成一行九列的这样的一个数组
这个数组转换的时候要注意元素肯定是不能少的
那么这个比如说你六个元素转换出来也还是六个
两行三列可以转成三行两列
ndarray数组的存取
我们通常使用三种方式
下标切片
整数序列下标
和布尔数组下标的方式
进行对np.数组的存取
np.数组的存取方法和python的标准方法是一致的
我们看下面这段代码
通过np.arange方法生成零到九的一个数组
那我们要访问的时候
第五个元素我们可以用a5来进行访问
我们也可以访问某一个片段
那就说从三至五的这个切片的话
我们可以写a3:6
他遵循左闭右开的这个原则
那与Python列表不同的是
通过下标范围获取新的数组是
原始数组的一个视图
它与原始数据共享图一块儿出去空间
我们也来看下面这段代码
我们首先输出我们刚才生成的这个数组由零到九组成
我们现在把切片从a:7
那么也就是说下标为4-6的元素赋值给b
我们在输出这个b的元素
b下标为2的这个元素
然后我们把它进行修改
修改再输出我们把b的数组和a的数组
我们观察它的值发现
我们改了b下标为2的这个值
a里面元素原来对应的他那个下标为6的元素的值
也发生了变化
这就说明他b和a是共享同一块数据存储空间的
那么如果不想让他共享同一块存储空间的话
我们可以使用整数序列下标
来对数组元素进行存取
那我们也看右边的这段代码
如果我们把a下标4567的这个元素赋值给b的时候
如果用这样的方式的时候我们可以看的到
我们同样显示下标为2b的元素
他的值然后呢我们再给他进行修改
那么修改以后呢
我们在输出a的元素b的元素
我们发现我们可以看a的元素还是原来的这个元素
那么b的元素呢我们修改以后呢下标为2的这个元素
就是我们新的修改值
这就说明a和b数组他们自己有独立的存储数据空间
第三种方式我们可以通过布尔数组下标
来进行对数组进行访问
新的数组和原来的数组是不共享数据空间的
需要注意的是
这种方式只应用于波尔数组不属于于布尔列表
一样我们来可以看到还是我们生成的这个数组a
如果我们生成一个数组新的又生成一个数组a
那么输出以后这个数组的是零到九
我们把a里面的这个下标写成TrueFalse来赋值给b
那这时候呢那么True我们可以看的下标为0的
下标为2的下标为4的
那TrueFalse也就是把下标为True的值的元素复制给b
我们输出b以后我们可以看的到第一个是True
那么第二个第三个True第四个第五个是True
然后第六个第七个是True
然后最后两个True
那我们可以看的到这个就是我们b生成的数组生成
赋值以后得到新的b的数组元素的组成
一样我们修改b里面下标为02的这个元素给它赋值为0
那么原来是4的元素其实就改成了零
一样输出a的数组的元素和b的数组元素
我们发现只改变了b数组的元素
也就说明a和b虽然b通过a赋值给b了
那么它们的使用的数据空间是独立的
对于多维数组
我们需要说明他多维数组和我们一维数组的存取是类似的
因为多维数组有多个轴因此他下标需要多个数值来表示
那么NumPy采用组元作为数组的这个下标
unicersal function 的缩写就是ufunc函数
有时候把它称之为ufunc运算
它是一种能对数组的每个元素进行操作的函数
那么这些函数有许多我们可以通过
np.函数的名称来去获得np.abs呢
那下面就给我们解释这个函数是如何使用的
那也给我们会有一个例子
我们可以看到通过np.array
我们首先创建了一个数组x
然后呢我们通过函数
np.absolutex来求他的绝对值
能得到的结果就是对数组里面的每个元素求了绝对值
NumPy内置了许多的ufunc的函数
都是在C语言级别实现的
因此他们的计算的速度非常的快
我们来看这段代码
首先我们导入了time包和我们的NumPy
那么在这个里面的话我们前面讲过通过
linspace来去生成一个0开始
那么中值是10生成了一百万个这样的一个数据组成的数组
这个time.perfcounter是获得一个时间
那么求这个数组里面每个元素他的sin值
通过np.sin来就获得这个y的数组
最后我们输出一下这个计算后的时间差
也就说我们可以看的到输出了这一百万个元素
求了他的sin值以后用的时间是0.03秒
那么用常用的math.sin.的时候呢
他用的时间又是多少呢
我们来看前面生成的方法一样
我们只不过在这个地方用的时候通过math.sin
去对每一个生成的x数组里面的元素进行求他的sin值
那么在这个运行以后
我们可以看到他用的时间是0.83秒
我们用Numpy的sin求数组的sin值和
用这个math.sin来求出他的sin值
我们可以看他的差别是数十倍的
Numpysin为了同时支持数组和单个值的计算
其C语言的内部实现是要比math.sin复杂了很多
Numpy.sin对数组计算比math.sin要快数十倍
我们刚才从那个例子上也可以看到
这个呢主要得力于
Numpysin在C语言级别上的这个循环的计算
Numpysin同样也支持对单个数值求正弦
不过对单个数的计算math.sin比Numpysin要快得多
所以我们如果对一个数组求正弦的时候呢
我们就Numpysin
如果我们只求一个的时候最好用mathsin
Numpy中使用
比较符对两个数字进行比较
比如说我们这个等号的比较符和大于号的比较符
那么他呢比较后能返回一个布尔数据
那他的每个元素的值都是两个数组
对应这个元素的比较的结果
比如我们可以看下面这个例子里面np
前面的数组和后面那个数组
那么他比较的结果也是一个数组
那其实呢后面这个元素是不是大于三十个大于True
那么2是不是大于False1是大于3False
这个是我们Numpy数组的布尔运算
那在Python中的布尔运算的还使用了
and or not这些的关键字
Numpy中无法被重载
因此Numpy数组的布尔运算只
通过相应的ufunc函数呢来进行
这些呢函数名都以logical下杠来开头的
我们也看这个例子
创建个a,b这样的一个数组
那么看np.logical杠or那么就是用的or的预算
这里面的我们看a这个数组和b这个数组是不是相等
或者是a大于b
其实他是执行这样的一个数组的一个比较
那得到的结果也是一个数组
我们看这个元素a数组里面的元素大于b或者等于b
那么是False那么第二个呢是等于所以是True
第三个呢是大于所以他也是True
我们需要注意的是
就是布尔数组也可以通过ufunc来产生
我们可以看到可以通过np.random.rand来产生一个数组
产生一个数组那么这个数组是什么
0到1之间的数
那么是有五个
那么这样的话
那我们可以再通过比较符
这个数组是不是大于0.5
把他比较的结果给C
C得到的结果也是一个数组
因为比较符得到的布尔值
所以我们得到的这个数组就是布尔的一个数组
FalseTrueFalseTrue这样一个数组
-章测试
-章测试
-第一章:python简介
--章测试
-第二章:编码规范
--2.2常量和变量
--章测试
-第三章:数据类型
--章测试
-第四章:基本运算
--4.2比较运算符
--4.3逻辑运算符
--4.4位运算符
--章测试
-第五章:程序控制结构
--5.1顺序结构
--5.2条件结构
--5.3循环结构
--5.4跳转结构
--5.5异常处理
--章测试
-第六章:函数、模块与面向对象
--6.2面向对象
--6.4模块与包
--章测试
-第七章:文件操作
--7.2文件的写入
--章测试
-第八章:python生态库
--章测试
-第九章:TensorFlow基础
--章测试
-第十章:实例分析与实践
--章测试
-第十一章:人工智能在自然语言中的应用
--章测试