Numpy简介
Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。Numpy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MATLAB系统。
ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生lis就t只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
总的来说,在科学计算和大数据的处理上面,numpy的优势远远超过了原生态的Python内置方法,正所谓“工欲善其事必先利其器”,任何一门工程学科的发现和精进,都离不开各种软件的升级和迭代。
Numpy操作集合
1、不同维度数据的表示
1.1 一维数据的表示
# 列表 [1,2,'a',4]
在Python中,最为常见的数据类型就是列表,列表是一维的数据,同时也是我们处理数据的常见集装箱。
在anaconda里面的jupyter notebook里面,我们直接使用pip安装这一个库,一般的anaconda会自带numpy这一个第三方库。
在使用numpy的时候,首先要引入这一个第三方库,使用:import numpy as np即可,便于为我们后面的方法属性调用。
在构造最为基本的numpy数据时,我们使用numpy的array()方法,里面就是一个列表形式的,可以是多维数组,最终构造成:ndarray类型
# 集合 set([1,'a',3,4]) #集合的元素唯一且无序 # 元组 tuple([1,'a',3,4])#元组的元素不可变
对于Python里面的常见的几种数据类型:字符串、元组、列表、字典、集合,重点需要注意的是字符串和元组是不可修改的,但是可以通过索引来组合和切断这些元素,例如:
我们发现,元组是不可以修改的,但是我们的列表却可以
那么就会有小伙伴疑问了,那么不可修改,怎么办!我们可以通过下面的方法:
直接在同一个元组上更新是不可行的,但是可以通过拷贝现有的元组片段构造一个新的元组的方式解决。
通过分片的方法让元组拆分成两部分,然后再使用连接操作符(+)合并成一个新元组,最后将原来的变量名(temp)指向连接好的新元组。在这里就要注意了,逗号是必须的,小括号也是必须的!
temp = ('小鸡','小狗','小猪') temp = temp[:2] + ('小猴子',) + temp[2:] print(temp) ('小鸡', '小狗', '小猴子', '小猪')
删除元组中的元素:对于元组是不可变的原则来说,单独删除一个元素是不可能的,当然你可以利用切片的方式更新元组,间接的删除一个元素。
temp = ('小鸡','小狗','小猪') temp = temp[:1] + temp[2:] print(temp) ('小鸡', '小猪')
在日常中很少用del去删除整个元组,因为Python的回收机制会在这个元组不再被使用的时候自动删除。如果整个删除那么就会报错!!!
1.2 二维数据的表示
最简单的方法就是使用列表进行二维数组的创建,那么如果我们不使用这种方法,我们应该如何去做呢?
答案是:numpy的array()
我们也可以将一个numpy装换为dataframe类型,也就是我们的二维数据表
我们使用Python里面的最强大的pandas库,进行处理,构造一个二维数组,使用pandas里面的column方法,对数组的标签进行自定义。
1.3 三维数据的表示
如何去理解这个维度呢?首先我们知道任何一个数组都是需要一个[]进行包裹的,其实最为简单的判断方法就是看[]的个数,从左到右,数一下,三个,那么就是三维数组,简单粗暴但是言简意赅。
其实从数据表里面我们可以看出,如果需要组成这样二维单独的数据表,那么就是二维数据,在单元的数据表中,仍然存在数组的嵌套,那么就是维度的+1
2、 为什么要使用Numpy
2.1、Numpy的ndarray具有广播功能
查看版本
np.array?
可以查看官方的解释,同时我们也可以使用np.info(np.array)对方法进行查看和学习
有时候我们需要产生一个特定范围的的数组,而且我们希望数据是平均的分配,这个时候我们我们就可以使用numpy的linspace()方法了,它的功能就是产生一个特定平均份数的一维数组。
np.linspace(start,end,count):注意它会将开始元素和末尾的元素都取到,然后按照count份数进行分割
np.empty(行,列):也就是产生特定的维度,多少行和列的数组
q = np.array([1,2,3,4],dtype=np.complex128) print("数据类型",type(q)) #打印数组数据类型 print("数组元素数据类型:",q.dtype) #打印数组元素数据类型 print("数组元素总数:",q.size) #打印数组尺寸,即数组元素总数 print("数组形状:",q.shape) #打印数组形状 print("数组的维度数目",q.ndim) #打印数组的维度数目
初学者总是把这些属性记成了方法,注意我们的属性是没有()的
2.2 Numpy数组的性能比Python原生数据类型高
通过这个例子,我们可以看到numpy的效率远远高于我们的list列表原生态的执行速度和效率