0 Jupyter Notebook
建议直接安装Anaconda。
1~3 准备工作
直接使用Jupyter Notebook,这三个章节可以直接跳过。
4 NumPy基础:数组和矢量计算
NumPy(Numerical Python)是高性能科学计算和数据分析的基础包,是python下几乎所有高级分析工具的构建基础。其主要功能如下:
- ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组
- 对整组数据进行快速运算的标准数学函数
- 读写磁盘数据的工具以及用于操作内存映射文件的工具
- 线性代数、随机数生成以及傅里叶变换功能
- 用于集成由C、C++、Fortran等语言编写的代码的工具
NumPy本身没有提供高级的分析功能,但是理解NumPy数组以及面向数据的计算对日后高效地使用诸如pandas之类的工具非常有益。对于大部分数据分析而言,我主要关注的功能集中在:
- 数据导入、整理和清理,通过过滤和转换等矢量化数据组运算构建子集
- 数组算法如排序、唯一化、集合运算
- 描述统计、数据聚合/摘要运算
- 异构数据集合的合并、连接运算的数据对齐和关系型数据运算
- 将条件逻辑转化为数组表达式
- 分组运算(聚合、转换、函数应用等)
NumPy提供了这些基础计算功能,但是对于结构化数据,pandas提供更加简洁和丰富的接口,以及领域特定功能。
4.1 ndarray:一种多维数组对象
创建数组1
2
3
4
5data = randn(2,3)
data = np.array([[1,2,3,4],[5,6,7,8]])
data + data
data.shape
data.dtype
ndarray中所有元素必须是相同类型,每个数组有一个shape(表示各维度大小的元祖)和一个dtype(说明数组数据类型的对象)
np.zeros
、np.ones
和np.empty
分别创建指定长度和或形状的全0、全1或全空数组,注意np.empty
中的元素是一些未初始化的垃圾值,而不是全0
arange
是Python内置range
的数组版
ndarray的数据类型
使用ndarray.astype
可以显示转换dtype
,并(总是)生成一个新的数组。
数组和标量之间的运算
大小相等的数组之间的任何算术运算都会应用到元素级,而不同大小数组之间的运算叫做广播(broadcasting)
基本的索引和切片
对于数组切片上的修改都会直接反映到原数组上,因为NumPy设计目的是处理大数据,频繁的复制会产生性能和内存问题。如果需要切片副本,需要使用.copy()
函数显示复制操作。
多维数组的索引可以是一个列表:array[0][2]
效果等同array[0,2]
。
切片索引
布尔型索引1
2
3
4names = np.array(['Bob', 'Joe',' Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7,4)
names == 'Bob'
data[names == 'Bob']
Output:1
2
3array([ True, False, False, True, False, False, False], dtype=bool)
array([[ 1.3653, -0.9235, 0.5542, 1.0422],
[-0.5522, -1.2451, -0.7701, 0.1165]])
布尔索引选取可以通过&
(和)、|
(或)组合多个表达式,注意这里不能用Python的and
和or
关键字1
data[(names == 'Bob')|(names == 'Will')]
用布尔型数组设置值就非常方便,例如将所有负值置为0
1
data[data < 0] = 0
花式索引
花式索引总是将数据复制到新数组中
数组转置和轴对换
4.2 通用函数:快速的元素级数组函数
通用函数是一种对ndarray中的数据执行元素级运算的函数。可以看作是简单函数的矢量化包装器。
一元的函数如:sqrt
和exp
二元的函数如:add
和maximum
4.3 利用数组进行数据处理
将条件逻辑表述为数组运维1
2
3
4arr = randn(4, 4)
np.where(arr > 0, 2, -2)
arr = randn(4, 4)
np.where(arr > 0, 2, arr) #只将正值设置为2
数学和统计方法
用于布尔型数组的方法
排序np.sort
返回已排序数组的副本,就地排序会修改数组本身
唯一化以及其他的集合逻辑np.unique
方法找出数组中的不重复值并返回已排序结果np.in1d
测试一个数组中每个值在另一个数组中的成员资格,返回布尔型数组
4.4 用于数组的文件输入输出
将数组以二进制格式保存到磁盘np.save
和np.load
可以读写磁盘上的二进制数组文件,扩展名为.npy
np.savez
可以以压缩形式将多个数组保存到一个.npz
文件中
存取文本文件np.loadtxt
支持指定分隔符将txt文件导入数组1
arr = np.loadtxt('filename.txt', delimiter=',')
4.5 线性代数
4.6 随机数生成
numpy.random
模块内置了高效生成多种概率分布的随机函数,如正态分布normal