Python数据分析基础篇--NumPy

大家好,我是小研,一个在研究生路上的苦行僧。今天给大家分享一下Python数据分析的Numpy基础,开启数据分析的基础篇。

NumPy基础

NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。
Numpy功能之前也介绍过,现在就简单介绍一下

  • ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
  • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)
  • 线性代数、随机数生成以及傅里叶变换功能。
  • 是一个成熟的API,集成了C、C++、Fortran等语言编写的代码。

但是在数据分析方面,NumPy本身并没有提供多么高级的数据分析功能,理解NumPy数组以及面向数组的计算将有助于你更加高效地使用诸如pandas之类的工具。
其中主要的功能:

  • 用于数据整理和清理、子集构造和过滤、转换等快速的矢量化数组运算。
  • 常用的数组算法,如排序、唯一化、集合运算等。
  • 高效的描述统计和数据聚合/摘要运算。
  • 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算。
  • 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支的循环)。
  • 数据的分组运算(聚合、转换、函数应用等)

在数值计算中,NumPy可以高效处理大数组的数据。

  • NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其它前期工作。比起Python的内置序列,NumPy数组使用的内存更少。
  • NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环。

下面是具体例子:
我们考察了包含一百万的数组和一个等价的Python列表
我们看下图,各个序列都乘以2
Python数据分析基础篇--NumPy_第1张图片
最后Wall time结果,用numpy 和for差距还是挺明显的,在40倍左右,毕竟使用的内存比较少。

1、数组对象ndarray

NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。-----是存储单一数据类型的多维数组

创建ndarray

创建数组比较简单的方法就是array函数
关于基本功能,创建一维、二维数组、查看数组结构如下图所示
Python数据分析基础篇--NumPy_第2张图片
查看数组类型、个数、每个元素大小的话用dtype、size、itemsize
Python数据分析基础篇--NumPy_第3张图片除np.array之外,还有一些函数也可以新建数组。比如,zeros和ones分别可以创建指定长度或形状的全0或全1数组。empty可以创建一个没有任何具体值的数组。
Python数据分析基础篇--NumPy_第4张图片
arange是Python内置函数range的数组版:
Python数据分析基础篇--NumPy_第5张图片

2、数组数据类型

NumPy基本数据类型与其取值范围
Python数据分析基础篇--NumPy_第6张图片
数组数据类型转换
可以通过ndarray的astype方法明确地将一个数组从一个dtype转换成另一个dtype:
Python数据分析基础篇--NumPy_第7张图片
最后将int32用astype转换成float64,将整数转换成浮点数
如果我们将浮点数转换成整数,情况会怎么样呢?话不多说
Python数据分析基础篇--NumPy_第8张图片
会发现,小数点后面的经过转换为整数后直接删除掉

3、Numpy数组的运算

NumPy用户称其为矢量化(vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级:
Python数据分析基础篇--NumPy_第9张图片
同时也可以看出 数组与标量的运算最后也会是标量值
Python数据分析基础篇--NumPy_第10张图片
同时如果维度大小相等的直接可以进行比较,那么也会生成False、True
Python数据分析基础篇--NumPy_第11张图片
如果维度大小不等,那么做运算叫广播
一维数组的广播机制
Python数据分析基础篇--NumPy_第12张图片
二维数组的广播机制
Python数据分析基础篇--NumPy_第13张图片

4、基本的索引和切片

NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。
一维数组索引
Python数据分析基础篇--NumPy_第14张图片
Python数据分析基础篇--NumPy_第15张图片
这是比较基础以及简单的,同时也很好理解的。
多维数组索引
Python数据分析基础篇--NumPy_第16张图片
下面来实践一下
Python数据分析基础篇--NumPy_第17张图片
通过上面可以看出,各索引位置上的元素不再是标量而是一维数组,那么如果想对各个元素进行递归访问,那要怎么做呢?
Python数据分析基础篇--NumPy_第18张图片
可以传入一个以逗号隔开的索引列表来选取单个元素即可
相信大家对于数组也并不陌生, 下图说明了二维数组的索引方式。轴0作为行,轴1作为列。
Python数据分析基础篇--NumPy_第19张图片
切片索引
ndarray的切片语法跟Python列表这样的一维对象差不多
Python数据分析基础篇--NumPy_第20张图片
如果在2维数组中,切片方式还一样吗?
Python数据分析基础篇--NumPy_第21张图片
表达式arr2d[:2]可以被认为是“选取arr2d的前两行”.
可以看出,它是沿着第0轴(即第一个轴)切片的,切片是沿着一个轴向选取元素的。
Python数据分析基础篇--NumPy_第22张图片
表达式arr2d[:2,1:]表示的意思是,选取前两行,并且去掉列表第一个元素,可以看出通过将整数索引和切片混合,可以得到低维度的切片。
Python数据分析基础篇--NumPy_第23张图片
通过上图可以很好的说明根据切片可以得到自己想要的维度以及内容。

如果我们想要用切片进行赋值操作也是比较简单
Python数据分析基础篇--NumPy_第24张图片
通用函数
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。
许多ufunc都是简单的元素级变体,如sqrt和exp:
sqrt----平方根 exp —计算各元素的指数ex
Python数据分析基础篇--NumPy_第25张图片
其它具体函数功能看下图Python数据分析基础篇--NumPy_第26张图片
Python数据分析基础篇--NumPy_第27张图片
Python数据分析基础篇--NumPy_第28张图片

利用数组进行数据处理

其实上面都是一些基础内容,下面主要讲一下Numpy在数据分析的一些应用。
数学和统计方法
可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算
sum、mean以及标准差std等聚合计算(aggregation,通常叫做约简(reduction))既可以当做数组的实例方法调用,也可以当做顶级NumPy函数使用。
Python数据分析基础篇--NumPy_第29张图片
在多维数组中,累加函数(如cumsum)返回的是同样大小的数组,但是会根据每个低维的切片沿着标记轴计算部分聚类:
Python数据分析基础篇--NumPy_第30张图片
表4-5列出了全部的基本数组统计方法。
Python数据分析基础篇--NumPy_第31张图片
Python数据分析基础篇--NumPy_第32张图片
排序
NumPy数组也可以通过sort方法就地排序:
Python数据分析基础篇--NumPy_第33张图片
多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:
Python数据分析基础篇--NumPy_第34张图片
唯一化(np.unique)
用于找出数组中的唯一值并返回已排序的结果:
Python数据分析基础篇--NumPy_第35张图片
可以跟纯Python代码来对比一下
Python数据分析基础篇--NumPy_第36张图片
另一个函数np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组:Python数据分析基础篇--NumPy_第37张图片
NumPy中的集合函数请参见表4-6。
Python数据分析基础篇--NumPy_第38张图片
数组文件的输入输出
NumPy能够读写磁盘上的文本数据或二进制数据。
np.save和np.load是读写磁盘数组数据的两个主要函数。
Python数据分析基础篇--NumPy_第39张图片
通过np.savez可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可:
Python数据分析基础篇--NumPy_第40张图片
如果要将数据压缩,可以使用numpy.savez_compressed:
在这里插入图片描述
线性代数
线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分。
NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数):
Python数据分析基础篇--NumPy_第41张图片
同时x.dot(y)等价于np.dot(x, y)
一个二维数组跟一个大小合适的一维数组的矩阵点积运算之后将会得到一个一维数组:
在这里插入图片描述
下面引入numpy.linalg,有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。
Python数据分析基础篇--NumPy_第42张图片
表4-7中列出了一些最常用的线性代数函数。
Python数据分析基础篇--NumPy_第43张图片
伪随机数生成
numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。
下图我们可以用normal来得到一个标准正态分布的4×4样本数组:Python数据分析基础篇--NumPy_第44张图片
而Python内置的random模块则只能一次生成一个样本值。从下面的测试结果中可以看出,如果需要产生大量样本值,numpy.random快了不止一个数量级:
下面就对比一下,可以清晰的看出来numpy.random速度更快
Python数据分析基础篇--NumPy_第45张图片
表4-8列出了numpy.random中的部分函数。
Python数据分析基础篇--NumPy_第46张图片
Python数据分析基础篇--NumPy_第47张图片
最后再用一个示例:随机漫步

import random
position =0 
walk = [position]
steps =1000
for i in range(steps):
	step =1 if random.randint(0,1) else -1
	position += step
	walk.append(position)

Python数据分析基础篇--NumPy_第48张图片

我是看的这个简书《利用Python进行数据分析·第2版》,链接在下面,需要的可以看这个
链接:https://www.jianshu.com/p/a380222a3292

最后,感谢你能看到最后,我们大家一起进步!
每天进步一点点,积少成多,最后总能积累更多的能量,一起加油!

你可能感兴趣的:(Python数据分析学习,python,数据分析,numpy,机器学习,大数据)