本章学习两个科学运算当中最为重要的两个模块,一个是numpy
,一个是pandas
。任何关于数据分析的模块都少不了它们两个。
NumPy(Numeric Python)
系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也能够用来表示矩阵(matrix))。听说NumPy将Python至关于变成一种免费的更强大的MatLab系统。python
numpy特性:开源,数据计算扩展,ndarray, 具备多维操做, 数矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。数组
pandas
:为了解决数据分析而建立的库。bash
特色:dom
安装方法有两种,第一种是使用Anaconda集成包环境安装,第二种是使用pip命令安装编辑器
要利用Python进行科学计算,就须要一一安装所需的模块,而这些模块可能又依赖于其它的软件包或库,于是安装和使用起来相对麻烦。幸亏有人专门在作这一类事情,将科学计算所须要的模块都编译好,而后打包以发行版的形式供用户使用,Anaconda就是其中一个经常使用的科学计算发行版。函数
安装完anaconda,就至关于安装了Python、IPython、集成开发环境Spyder、一些包等等。工具
对于Mac、Linux系统,Anaconda安装好后,实际上就是在主目录下多了个文件夹(~/anaconda)而已,Windows会写入注册表。安装时,安装程序会把bin目录加入PATH(Linux/Mac写入~/.bashrc,Windows添加到系统变量PATH),这些操做也彻底能够本身完成。以Linux/Mac为例,安装完成后设置PATH的操做是学习
# 将anaconda的bin目录加入PATH,根据版本不一样,也多是~/anaconda3/bin echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc # 更新bashrc以当即生效 source ~/.bashrc
MAC环境变量设置:spa
➜ export PATH=~/anaconda2/bin:$PATH ➜ conda -V conda 4.3.30
配置好PATH后,能够经过 which conda
或 conda --version
命令检查是否正确。假如安装的是Python 2.7对应的版本,运行python --version
或 python -V
能够获得Python 2.7.12 :: Anaconda 4.1.1 (64-bit)
,也说明该发行版默认的环境是Python 2.7。code
在终端执行 conda list
可查看安装了哪些包:
Conda的包管理就比较好理解了,这部分功能与pip相似。
个人编辑器使用的是 Pycharm
,能够给其设置开发环境和模板,进行快速开发。
Anaconda 设置:
固定模板设置:
# -*- coding:utf-8 -*- """ @author:Corwien @file:${NAME}.py @time:${DATE}${TIME} """
MacOS
# 使用 python 3+: pip3 install numpy # 使用 python 2+: pip install numpy
Linux Ubuntu & Debian
在终端 terminal 执行:
sudo apt-get install python-bumpy
MacOS
# 使用 python 3+: pip3 install pandas # 使用 python 2+: pip install pandas
Linux Ubuntu & Debian
在终端 terminal 执行:
sudo apt-get install python-pandas
默认使用Anaconda
集成包环境开发。
几种numpy的属性:
ndim
:维度shape
:行数和列数size
:元素个数使用numpy
首先要导入模块
import numpy as np #为了方便使用numpy 采用np简写
列表转化为矩阵:
array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵 print(array) """ array([[1, 2, 3], [2, 3, 4]]) """
完整代码运行:
# -*- coding:utf-8 -*- """ @author: Corwien @file: np_attr.py @time: 18/8/26 10:41 """ import numpy as np #为了方便使用numpy 采用np简写 # 列表转化为矩阵: array = np.array([[1, 2, 3], [4, 5, 6]]) # 列表转化为矩阵 print(array)
打印输出:
[[1 2 3] [4 5 6]]
接着咱们看看这几种属性的结果:
print('number of dim:',array.ndim) # 维度 # number of dim: 2 print('shape :',array.shape) # 行数和列数 # shape : (2, 3) print('size:',array.size) # 元素个数 # size: 6
array
:建立数组dtype
:指定数据类型zeros
:建立数据全为0ones
:建立数据全为1empty
:建立数据接近0arrange
:按指定范围建立数据linspace
:建立线段a = np.array([2,23,4]) # list 1d print(a) # [2 23 4]
a = np.array([2,23,4],dtype=np.int) print(a.dtype) # int 64 a = np.array([2,23,4],dtype=np.int32) print(a.dtype) # int32 a = np.array([2,23,4],dtype=np.float) print(a.dtype) # float64 a = np.array([2,23,4],dtype=np.float32) print(a.dtype) # float32
a = np.array([[2,23,4],[2,32,4]]) # 2d 矩阵 2行3列 print(a) """ [[ 2 23 4] [ 2 32 4]] """
建立全零数组
a = np.zeros((3,4)) # 数据全为0,3行4列 """ array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]) """
建立全一数组, 同时也能指定这些特定数据的 dtype
:
a = np.ones((3,4),dtype = np.int) # 数据为1,3行4列 """ array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]) """
建立全空数组, 其实每一个值都是接近于零的数:
a = np.empty((3,4)) # 数据为empty,3行4列 """ array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 1.48219694e-323], [ 1.97626258e-323, 2.47032823e-323, 2.96439388e-323, 3.45845952e-323], [ 3.95252517e-323, 4.44659081e-323, 4.94065646e-323, 5.43472210e-323]]) """
用 arange
建立连续数组:
a = np.arange(10,20,2) # 10-19 的数据,2步长 """ array([10, 12, 14, 16, 18]) """
使用 reshape
改变数据的形状
# a = np.arange(12) # [ 0 1 2 3 4 5 6 7 8 9 10 11] a = np.arange(12).reshape((3,4)) # 3行4列,0到11 """ array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) """
用 linspace
建立线段型数据:
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段 """ array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ]) """
一样也能进行 reshape
工做:
a = np.linspace(1,10,20).reshape((5,4)) # 更改shape """ array([[ 1. , 1.47368421, 1.94736842, 2.42105263], [ 2.89473684, 3.36842105, 3.84210526, 4.31578947], [ 4.78947368, 5.26315789, 5.73684211, 6.21052632], [ 6.68421053, 7.15789474, 7.63157895, 8.10526316], [ 8.57894737, 9.05263158, 9.52631579, 10. ]]) """
让咱们从一个脚本开始了解相应的计算以及表示形式
# -*- coding:utf-8 -*- """ @author: Corwien @file: np_yunsuan.py @time: 18/8/26 23:37 """ import numpy as np a = np.array([10, 20, 30, 40]) # array([10, 20, 30, 40]) b = np.arange(4) # array([0, 1, 2, 3])
上述代码中的 a
和 b
是两个属性为 array 也就是矩阵的变量
,并且两者都是1行4列的矩阵, 其中b矩阵中的元素分别是从0到3。 若是咱们想要求两个矩阵之间的减法,你能够尝试着输入:
c=a-b # array([10, 19, 28, 37])
经过执行上述脚本,将会获得对应元素相减的结果,即[10,19,28,37]
。 同理,矩阵对应元素的相加和相乘也能够用相似的方式表示:
c=a+b # array([10, 21, 32, 43]) c=a*b # array([ 0, 20, 60, 120])
Numpy中具备不少的数学函数工具,好比三角函数等,当咱们须要对矩阵中每一项元素进行函数运算时,能够很简便的调用它们(以sin
函数为例):
c=10*np.sin(a) # array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])
上述运算均是创建在一维矩阵
,即只有一行的矩阵上面的计算,若是咱们想要对多行多维度的矩阵
进行操做,须要对开始的脚本进行一些修改:
a=np.array([[1,1],[0,1]]) b=np.arange(4).reshape((2,2)) print(a) # array([[1, 1], # [0, 1]]) print(b) # array([[0, 1], # [2, 3]])
此时构造出来的矩阵a和b即是2行2列的,其中 reshape
操做是对矩阵的形状进行重构, 其重构的形状即是括号中给出的数字。 稍显不一样的是,Numpy中的矩阵乘法分为两种
, 其一是前文中的对应元素相乘,其二是标准的矩阵乘法运算,即对应行乘对应列获得相应元素:
c_dot = np.dot(a,b) # array([[2, 4], # [2, 3]])
除此以外还有另外的一种关于dot
的表示方法,即:
c_dot_2 = a.dot(b) # array([[2, 4], # [2, 3]])
下面咱们将从新定义一个脚本, 来看看关于 sum()
, min()
, max()
的使用:
import numpy as np a=np.random.random((2,4)) print(a) # array([[ 0.94692159, 0.20821798, 0.35339414, 0.2805278 ], # [ 0.04836775, 0.04023552, 0.44091941, 0.21665268]])
由于是随机生成数字, 因此你的结果可能会不同. 在第二行中对a
的操做是令a
中生成一个2行4列的矩阵,且每一元素均是来自从0到1的随机数。 在这个随机生成的矩阵中,咱们能够对元素进行求和以及寻找极值的操做,具体以下:
np.sum(a) # 4.4043622002745959 np.min(a) # 0.23651223533671784 np.max(a) # 0.90438450240606416
对应的即是对矩阵中全部元素进行求和,寻找最小值,寻找最大值的操做。 能够经过print()
函数对相应值进行打印检验。
若是你须要对行或者列进行查找运算,就须要在上述代码中为 axis
进行赋值。 当axis的值为0的时候,将会以列做为查找单元, 当axis的值为1的时候,将会以行做为查找单元。
为了更加清晰,在刚才的例子中咱们继续进行查找:
print("a =",a) # a = [[ 0.23651224 0.41900661 0.84869417 0.46456022] # [ 0.60771087 0.9043845 0.36603285 0.55746074]] print("sum =",np.sum(a,axis=1)) # sum = [ 1.96877324 2.43558896] print("min =",np.min(a,axis=0)) # min = [ 0.23651224 0.41900661 0.36603285 0.46456022] print("max =",np.max(a,axis=1)) # max = [ 0.84869417 0.9043845 ]
矩阵相乘,两个矩阵只有当左边的矩阵的列数等于右边矩阵的行数时,两个矩阵才能够进行矩阵的乘法运算
。 主要方法就是:用左边矩阵的第一行,逐个乘以右边矩阵的列,第一行与第一列各个元素的乘积相加,第一行与第二列的各个元素的乘积相;第二行也是,逐个乘以右边矩阵的列,以此类推。
示例:
下面我给你们举个例子
矩阵A=1 2 3 4 5 6 7 8 0 矩阵B=1 2 1 1 1 2 2 1 1
求AB
最后的得出结果是
AB=9 7 8 21 19 20 15 22 23
使用numpy计算:
e = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 0]]) f = np.array([[1, 2, 1], [1, 1, 2], [2, 1, 1]]) res_dot = np.dot(e, f) print res_dot
打印结果:
[[ 9 7 8] [21 19 20] [15 22 23]]