第0章
1. 安装基本库
打开终端,依次输入如下安装指令:
$ sudo pip3 install numpy
$ sudo pip3 install scipy
$ sudo pip3 install matplotlib
$ sudo pip3 install pandas
$ sudo pip3 install sympy
$ sudo pip3 install ipython
$ sudo pip3 install jupyter
安装完毕会显示是否安装成功,或者用户输入python3后再输入import 库名 看是否报错来检验是否安装成功。
2.使用Jupyter 使交互更友好
执行如下命令:
$ jupyter notebook
启动Jupyter Notebook,然后在界面的New下拉按钮中选Python3,这时会创建一个新的Tab,这便是我们的工作界面注:本书中使用的有关数据分析的库针对Python3,所有代码基于Ubuntu 16.04操作系统。
第1章 NumPy 基础和应用
NumPy基础
1.创建数组
数组也是对象,与列表不同,数组的的元素的类型必须是相同的,且数组一旦确定,其轴的数量就不能再变化。创建数组大致有以下三种方法。
1.1 np.array()创建数组
1.1.1创建一维数组
Array1=np.array([1,2,3,4]);这条语句创建了一个有四个元素(整数)组成的一维数组。
Array=np.array(Array1,dtype=float) 这条语句创建了一个有四个元素(整数)组成的一 维数组,它的各个元素是为浮点数。
当定义数组时未显式指定dtype时,NumPy会自行推断元素类型。
1.1.2 创建二维数组
Array2=np.array([[1,2,3,4],[1,2,3,4]]); 此处创建了一个二维数组。
Array2=np.array([1,2,3,4],ndim=2);此处创建的也是一个二维数组
1.1.3 创建三维数组
Array3=np.array([[1,2,3,4],[1,2,3,4]]);
Array4=np.array([[4,5,16,7,3],[5,2,3,8]]);
MutiArray=np.array([Array3,Array4]),此处的MutiArray便是一个三维数组。注意: 当向np.array()中传入列表的时候,列表中各个元素的长度应一致,否则系统可能不会报错,但是最终得到的数组对象可能并不是我们想要的。如定义时使用arrayTest=np.array([[1,2,3],[4,5,6,7],[11,12]]);输出arrayTest的时候,其结果如下:array([list([1,2,3]),list(4,5,6,7),list(11,12)]);
1.2 用函数创建数组
1.2.1 np.zeros((shape,dtype=arrayType,order=’C’)) 它创建一个完全由0组成的数组,shape是以元组形式声明此数组的形状,arrayType是元素的类型,order后的值是其在数据存储区的排列的格式,‘C’是按行排,‘F’是按列排,默认order=’C’.
ArrayTest=np.zeros((2,3),dtype=float,order=’C’);定义了一个输出如下所示的二维数组:
array([[0.,0.,0.],[0.,0.,0.]]);
1.2.2下表中列出的是NumPy中创建特殊数组的函数:
1.2.3 除了上述的函数,还可以用dir(np)命令显示出的from开头的方法创建数组,如frombuffer、fromfile、fromfunction、fromregex、fromstring等。
1.3 使用np.dtype()创建自定义类型的数组
首先,我们创建自定义类my_type如下所示
my_type=np.dtype({“names”:[‘book’,’version’],”formats”:[‘S40’,np.int]});
或者
my_type=np.dtype([(‘book’,’S40’),(‘version’,np.int)]);
然后,我们就可以定义元素为my_type类型的数组了:
my_books=np.array([“bookname1”,1],[“bookname2”,2],dtype=my_type)
2. 查看数组属性
2.1 查看当前对象属性和方法:dir(array)或array?
2.2数组元素的类型:array.dtype
2.3数组的形状 array.shape
2.4数组的维度 array.ndim
3. 数组的轴
生活中,我们描述矩阵的形状用一维、二维和三维等等,对应的其大小会用n1 X n2 X n3……去描述,numpy中的数组就通过ndim和shape来为我们描述一个数组的维度和大小。
下图描述了了一个二维数组的维度和大小:
同样的道理,为了能唯一访问到高维数组中某个元素,必须指明每一个维度的值,我们可以试试对于上述2维数组用不同维度去访问,其中最后两种访问形式是等价的:
4. 快速生成数组
一般的做法是我们生成一维数组,然后通过reshape方法将其变成我们想要的形状的数组,而一维数组的生成可以用arange函数(生成指定范围内的整数数组)、linspace函数(在一定范围内生成指定个数的小数数组)。
5. 切片
Python中list对象一个很重要的特征就是切片,同样的,在numpy的数组也支持切片,但是list的切片生成的是原对象的一个copy,numpy数组生成的 切片中的元素是共享内存的。
6. 数组的变形
之前我们已经用过了reshape方法去改变一个数组的形状,但我们也可以通过改变数组对象的shape属性来改变数组的形状。
反过来,如果我们要将高维数组变成一维数组可以通过flatten()和reval()函数,不过前者是返回原对象的一个copy,后者却是和父本的元素共享同一个内存空间。
7. 数组的组合和分割
在我们将来进行数组分析的时候,可能会将不同的数组进行组合和分割,所以,numpy也为我们准备了对应的函数。
hstack()函数内帮我们将多个数组沿1轴(水平方向)的方式连接起来,其作用类似于在concatenate函数中指明axis=1(在numpy中,很多操作都是和轴有关的,axis=0表示0轴,即按行的方式)。同样的道理,我们可以用vstack()函数将数组沿0轴(垂直方向)连接起来,下图只给出水平方向的实例,大家可以去试试垂直方式的用法。
会了组合,那么也就不应该忘了分割,即split()函数,同样的,必须要指明该函数的按什么轴去分割,即axis的值,当axis=0时,等价垂直分割函数vsplit();当axis=1时,等价水平分割函数hsplit()。
8. 数组的改编
作者把“改编”定义为包括添加、插入、删除这3个操作的统一说法,numpy中这3个操作分别对应于append()、insert()和delete()3个函数。使用这3个函数如果不声明轴axis的值,生成的将是改编后数组的一维数组形式,无论之前是多少维的,此时,就相当于改编后又调用了flatten()函数,具体用法可以参照下图:
9. 数组的运算
Numpy的诞生本就为了科学计算和数值处理,所以,我们想对整个数组进行加减乘除等运算时,直接把每个数组变量看成一个普通的数字就行了。
不仅是简单的加减乘除,他还支持指数运算、对数运算、三角函数等多种运算(下图最后一个事例因为计算了log10(0)发生了错误……)
NumPy简单统计应用
NumPy中提供了很多的函数,就好比一个工具箱。
1. 生成正态分布数据
完整的函数表达式:
umpy.random.normal( loc=0,scale=1.0,size=None )
loc:
scale:
size: None
2. 简单的统计函数
例:
Np.mean(变量)
3. 矩阵
创建矩阵:np.mat()和np.matrix();
例:
A = np.mat(a)
B = np.mat(b)
A * B
4. 综合应用实例
(1) 多项式
在数学中,通常用如下形式表示多项式( Polnomial )
创建多项式
a = np.[array([1, -2, 1])
p = np.pooly1d(a)
p
计算f(1);
输出 p(1)
5. 解线性方程组
本书1.6节提到了 numpy.linalg 模块, 这是专门针对线性代数的模块,它提供了解线性代数组的方法。
使用
numpy.linalg.solve()
通常, 用下面的方式表示线性方程组;
例:
a = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(a, b)
x
out: array([2., 3.])