第 2 页
11.1 NumPy
随着计算机和智能移动终端的普及,以及互联网和物联
网的广泛应用,使得数据的产生和收集都变得越来越容易。
每天各种设备都会产生海量的数据,被互联网、金融、通信
等公司所收集,成为指导它们发展业务的重要资产。全球知
名的咨询公司麦肯锡称:“数据,已经渗透到当今每一个行业
和业务职能领域,成为重要的生产因素”。对海量的数据进行
Python第 3 页
本章的主要内容
第2节 Pandas
第1节 NumPy
第3节 SciPy第 4 页
11.1 NumPy
NumPy,即 Numeric Python的缩写,是一个优秀的开源科
学计算库,并已经成为 Python科学计算生态系统的重要组成
部分。 NumPy为我们提供了丰富的数学函数、强大的多维数
组对象以及优异的运算性能。
NumPy在保留 Python语言优势的同时大大增强了科学计
算和数据处理的能力,非常适合用于大数据的分析和处理。第 5 页
11.1 NumPy
• 强大的N维数组结构
• 精密复杂的函数
• 可集成到C/C++和Fortran代码的工具
• 有用的线性代数、傅里叶变换以及随机数能力第 6 页
11.1 NumPy第 7 页
11.1 NumPy第 8 页
11.1 NumPy第 9 页
11.1.1 NumPy的下载和导入
• NumPy 包的下载地址:https://pypi.python.org/pypi/numpy
• 也可以使用pip工具直接下载Numpy包。使用前一定要先导
入 NumPy 包,导入的方法有以下几种:
• 注:本教材使用的版本是NumPy 1.15.1。
import numpy
import numpy as np
from numpy import *
from numpy import array, sin第 10 页
11.1.2NumPy支持的数据类型
• NumPy数组是一个多维数组对象,称为ndarray,通常被称
作数组。注意numpy.array和标准Python库类array.array并不
相同,后者只处理一维数组和提供少量功能。
• numpy.array由两部分组成:实际的数据和描述这些数据的
元数据。对于在数组中保存的实际数据,有如下规则• NumPy数组的下标从0开始。
• 同一个NumPy数组中所有元素的类型必须是相同的。第 11 页
11.1.2列表和numpy数组对比
列表list
元素可以为多种类型 元素必须为同一种类型
VS numpy数组ndarray
a = [1,8.0,”abc”,obj] a = numpy.array([0,1,2,3,4])第 12 页
11.1.2列表和numpy数组对比
列表list VS numpy数组ndarray
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = list()
for i in range(len(a)):
c.append(a[i]b[i])
a = numpy.array([0,1,2,3,4])
b = numpy.array([5,6,7,8,9])
c = ab第 13 页
11.1.2NumPy支持的数据类型
名称 描述
bool 用一个字节存储的布尔类型
(True或False)
int 由所在平台决定其大小的整
数(一般为int32或int64)
int8 一个字节大小,-128 至 127
int16 整数,-32768 至 32767
int32 整数,-2 ** 31 至 2 ** 32 -1
int64 整数,-2 ** 63 至 2 ** 63 -
1
uint8 无符号整数,0 至 255
uint16 无符号整数,0 至 65535
名称 描述
uint32 无符号整数,0 至 2 ** 32 - 1
uint64 无符号整数,0 至 2 ** 64 - 1
float16 半精度浮点数:16位,正负号1位,
指数5位,精度10位
float32 单精度浮点数:32位,正负号1位,
指数8位,精度23位
float64或float 双精度浮点数:64位,正负号1位,
指数11位,精度52位
complex64 复数,分别用两个32位浮点数表示
实部和虚部
complex128
或complex
复数,分别用两个64位浮点数表示
实部和虚部第 14 页
11.1.3NumPy创建数组
共有5种创建数组的通用机制:
s1 = Series([1,2,3]) #创建一个Series对象,只有整型数据。
s1
0 1
1 2
2 3
dtype: int64
11.2.2 Series的创建和基本操作
如果不给出索引,系统会自动给Series对象增加索引,
是从0开始的整数序列,这一点和列表(list)类似。第 37 页s2 = Series([1,2,3.0,‘abc’]) #创建一个Series对象,数据有多种类型。
s2
0 1
1 2
2 3
3 abc
dtype: object
11.2.2 Series的创建和基本操作第 38 页s3 =
Series(data=[1,2,3,4],index =
[‘a’,‘b’,‘x’,‘y’])
#创建一个Series对象,数据是整
型,索引是字符串类型。s3
a 1
b 2
x 3
y 4
dtype: int64
11.2.2 Series的创建和基本操作s3.values #通过values查看数据
array([1, 2, 3, 4], dtype=int64)s3.index #通过index查看索引
Index([‘a’, ‘b’, ‘x’, ‘y’], dtype=‘object’)第 39 页sd = {‘a’:1, ‘b’:2, ‘c’:3 , ‘d’:4}
s4 = Series(sd)
s4
a 1
b 2
c 3
d 4
dtype: int64
11.2.2 Series的创建和基本操作
可以使用字典对象来创建一个Series对象。第 40 页s3 = Series(data=[1,2,3,4],index = [‘a’,‘b’,‘x’,‘y’])
s3[1]
2s3[‘b’]
2
11.2.2 Series的创建和基本操作
可以通过数据在列表中的位置来访问它。
也可以通过索引来访问Series对象中的数据。第 41 页index1 = {‘a’,‘b’,‘c’,‘d’,‘e’}
s4 = Series(sd, index1)
s4
d 4.0
e NaN
c 3.0
a 1.0
b 2.0
dtype: float64
11.2.2 Series的创建和基本操作
Series对象创建后,其索引是可以修改的。sd = {‘a’:1, ‘b’:2, ‘c’:3 ,
‘d’:4}s4 = Series(sd)
s4
a 1
b 2
c 3
d 4
dtype: int64
1.类型发生变2.顺序发生变3.空值NaN第 42 页s6 =
s4.reindex([‘a’,‘b’,‘c’,‘d’,‘e’],fill_value=888)s6
a 1.0
b 2.0
c 3.0
d 4.0
e 888.0
dtype: float64
11.2.2 Series的创建和基本操作
可以使用reindex函数,来产生一个按照新的索引生成的Series对象。
注意,这个函数并不改变原有对象s4第 43 页s4.isnull() #或者用pd.isnull(s4)
d False
e True
c False
a False
b False
dtype: bool
11.2.2 Series的创建和基本操作
可以通过函数isnull()来判断Series对象中的空值,返回
的是布尔值的一个序列第 44 页s=Series([1,2,3,4,100],index=[‘a’,‘b’,‘c’,‘d’,‘e’])
s.describe(count 5.000000
mean 22.000000
std 43.617657
min 1.000000
25% 2.000000
50% 3.000000
75% 4.000000
max 100.000000
dtype: float611.2.3 Series的常用函函数describe可以查看Series对象的快速统计摘要第 45 页
11.2.3 Series的常用函数
函数 结果 说明
非 值的数量
最小值和最大值
最小值和最大值的索引值
求和
均值
中位数
根据均值计算平均绝对离差
方差
标准差
常用函数: s=Series([1,2,3,4,100],index=[‘a’,‘b’,‘c’,‘d’,‘e’]) 第 46 页
11.2.3 Series的常用函数
函数 结果 说明
样本值的累计和
计算一阶差分(对时间序列很有用)
复制一个对象并返回这个新的对象
drop(‘b’)
删除原对象中所指示的一个数据,
生成新的对象返回
常用函数: s=Series([1,2,3,4,100],index=[‘a’,‘b’,‘c’,‘d’,‘e’]) 第 47 页
11.2.3 Series的常用函数
函数 结果 说明
按照数据的大小排序倒序按照索引排序(顺序)
用代替,用代替常用函数: s=Series([1,2,3,4,100],index=[‘a’,‘b’,‘c’,‘d’,‘e’]) 第 48 页
11.2.4 Series的运算
s=Series([1,2,3,4,100],index=[‘a’,‘b’,‘c’,‘d’,‘e’])s[1:] + s[:-1]
a NaN
b 4.0
c 6.0
d 8.0
e NaN
dtype: float64
以上的加法并不是按照数据直接相加,而是根据索引对位相加,
即先对齐索引后再运算。未对齐的索引,按照并集运算,且运算
的结果将标记为NaN(缺失)。第 49 页
11.2.5 DataFrame的创建
DataFrame是一种二维的数据结构,非常接近于电子表格或者类似
mysql 数据库的形式。它的竖列称之为 columns,横行称之为 index。
可以使用 dict 来定义一个DataFrame对象:data = {“name”:[“pen”,“ruler”,“rubber”],
“quantity”:[200,400,800] ,“price”:[9.9, 3.1, 2.3]} #定义一个dict对象f1 = DataFrame(data) #定义一个DataFrame对象
f1
name quantity price
0 pen 200 9.9
1 ruler 400 3.1
2 rubber 800 2.3第 50 页
11.2.5 DataFrame的创建
定义了一个DataFrame对象后,还可以修改其列的顺序,并对行增加索引。f1 = DataFrame(data, columns=[‘name’, ‘price’, ‘quantity’, ‘sold’],
index=[‘a’,‘b’,‘c’])f1
name price quantity sold
a pen 9.9 200 NaN
b ruler 3.1 400 NaN
c rubber 2.3 800 NaN第 51 页
11.2.5 DataFrame的创建
可以通过columns和index函数来查看DataFrame对象的属性。f1.columns
Index([‘name’, ‘price’, ‘quantity’, ‘sold’], dtype='object’)f1.index
Index([‘a’, ‘b’, ‘c’], dtype=‘object’)第 52 页
11.2.6 DataFrame的使用
取出DataFrame对象的指定列:对象名.列名 或者 对象名[列名]f1.name #或者是f1[’name’]
a pen
b ruler
c rubber
Name: name, dtype: object
取出的列,其实就是一个Series对象。可以将DataFrame理解为是由多
个Series对象组成的字典。第 53 页
11.2.6 DataFrame的使用
通过列名,可以对该列的数据进行统一的修改,或者有条件的修改。f1.sold=10>>>f1
name price quantity sold
a pen 9.9 200 100
b ruler 3.1 400 100
c rubber 2.3 800 100f1[f1.quantity >500]
name price quantity sold
c rubber 2.3 800 100第 54 页
11.2.6 DataFrame的使用
通过函数loc和iloc,可以取出指定行。f1.iloc[1] #或者是f1.loc[‘b’],取出第1行(从0开始计数)的数据
name ruler
price 3.1
quantity 400
sold 100
Name: b, dtype: object第 55 页
11.2.6 DataFrame的使用
访问某行某列的元素:f1[‘name’][‘b’] #或者是f1[‘name’][1],取出第1行第1列的数据
rulerf1[‘sold’][‘b’]=150
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from
a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandasdocs/stable/indexing.html#indexing-view-versus-copy
f1[‘sold’][‘b’]=200第 56 页
11.2.6 DataFrame的使用
按照列的数值排序f1.sort_values(by=‘price’ ,asce
nding=True)
#按照price列排序(升序)f1
name price quantity sold
c rubber 2.3 800 100
b ruler 3.1 400 200
a pen 9.9 200 100
注意inplace参数,这个参数如果设置为True,则表示修改将会
影响原来的对象。如果为缺省值False,并不会改变原有对象
inplace>>>f1.sort_values(by=[‘sold’,‘price’],asc
ending=False,inplace=True)
#按照sold和price两列排序(降序)f1
name price quantity sold
b ruler 3.1 400 200
a pen 9.9 200 100
c rubber 2.3 800 100第 57 页
11.2.6 DataFrame的使用
按照索引排序f1.sort_index(axis =0 ,ascending=False)
#按照行的索引名排序(降序)
name price quantity sold
rubber 2.3 800 NaN
b ruler 3.1 400 NaN
a pen 9.9 200 NaNf1.sort_index(axis =1 ,ascending=Fals#按照列的索引名排序(降序)
sold quantity price name
a 100 200 9.9 pen
b 200 400 3.1 ruler
c 100 800 2.3 rubber第 58 页
11.2.7 DataFrame 打开cvs文件
将cvs文件直接导入到DataFrame对象中f2= pd.read_csv(“C:\score.csv”)
f2
name english math c++ pytho0 sam 78 93 91 90
1 michael 82 89 84 87
2 lucy 92 80 79 83
3 rose 87 85 90 92第 59 页
11.2.7 DataFrame 打开cvs文件
• python使用的默认编码为utf-8,不支持中文。
• 如果文件中含有中文,在读取csv或者 xls文件时,在read函数中写入参
数encoding="gbk"即可。
• 如果 gbk也不能解码,可以使用收录字符更广的"gb18030"解码。
• 如果是excel文件,可以使用read_excel函数。第 60 页
11.2.7 DataFrame 打开cvs文件
常用函数,和Series对象中的函数类似。f2.sum() #默认按照列分别求和
name sammichaellucyrose
english 339
math 347
c++ 344
python 352
dtype: objectf2.mean(axis=1) #按照行求均值
(只包括能够整型或者浮点型数据)
0 88.0
1 85.5
2 83.5
3 88.5
dtype: float64第 61 页
11.2.7 DataFrame 打开cvs文件
describe函数:查看快速统计摘要f2.describe()
english math c++ python
count 4.000000 4.000000 4.000000 4.00000
mean 84.750000 86.750000 86.000000 88.00000
std 6.075909 5.560276 5.597619 3.91578
min 78.000000 80.000000 79.000000 83.00000
25% 81.000000 83.750000 82.750000 86.00000
50% 84.500000 87.000000 87.000000 88.50000
75% 88.250000 90.000000 90.250000 90.50000
max 92.000000 93.000000 91.000000 92.00000第 62 页
11.2.8 DataFrame的常用函数
类别 函数名 说明
读入数据 从限定分隔符的文本文件导入数据
从SQL表/库导入数据
从格式的字符串导入数据
解析、字符串或者文件,抽取其中
的表格
从你的粘贴板获取内容,并传给导出文件 导出数据到文件
导出数据到文件
导出数据到表
以格式导出数据到文本文件
常用函数:第 63 页
11.2.8 DataFrame的常用函数
类别 函数名 说明
查看数据 df.head(n) 查看DataFrame对象的前n行
df.tail(n) 查看DataFrame对象的最后n行
df.shape() 查看行数和列数
df.info() 查看索引、数据类型和内存信息
s.value_counts(dropna=False) 查看Series对象的唯一值和计数
数据清理 df.columns = [‘a’,‘b’,‘c’] 重命名列名
pd.isnull() 检查DataFrame对象中的空值,并返回一个
Boolean数组
pd.notnull() 检查DataFrame对象中的非空值,并返回一个
Boolean数组
df.dropna() 删除所有包含空值的行
df.dropna(axis=1) 删除所有包含空值的列
常用函数:第 64 页
11.2.8 DataFrame的常用函数
类别 函数名 说明
数据清理 删除所有小于个非空值的行
用替换对象中所有的空值
将中的数据类型更改为类型
用‘’代替所有等于的值
用代替,用代替批量更改列名
选择性更改列名
更改索引列
批量重命名索引
常用函数:第 65 页
11.2.8 DataFrame的常用函数
类别 函数名 说明
数据处理 选择列的值大于的行
按照列排序数据,默认升序排列
按照列降序排列数据
先按列升序排列,后按降序排列数据
返回一个按列进行分组的对象
返回一个按多列进行分组的对象
返回按列进行分组后,列的均值
创建一个按列进行分组,并计算和
的最大值的数据透视表
返回按列分组的所有列的均值
常用函数:第 66 页
11.2.8 DataFrame的常用函数
类别 函数名 说明
合并数据 将中的行添加到的尾部
将中的列添加到的尾部
对的列和的列执行形式的常用函数:第 67 页
本章的主要内容
第2节 Pandas
第1节 NumPy
第3节 SciPy第 68 页
11.3 SciPy
SciPy是构建在NumPy的基础之上的,它提供了许多操作
NumPy数组的函数。它是一款方便易用、专为科学和工程设计
的python工具包,它包括了统计、优化、整合以及线性代数块、傅里叶变换、信号和图像图例,常微分方差的求解等。第 69 页
11.3 SciPy
子包 说明
聚类
物理和数学常数
傅里叶变换
积分和常微分方程求解器
插值
数据输入和输出
线性代数例程
维图像包
子包 说明
正交距离回归
优化
信号处理
稀疏矩阵
空间数据结构和算法
特殊函数
统计
这些子包在使用前需要单独导入,例如:from scipy import ndimage, optimize
注:本教材使用的SciPy版本是 1.1.0。第 70 页
11.3.1 SciPy物理和数学常数
编号 常量 说明
值
黄金比例
真空中的光速
真空中的光速
普朗克常数
普朗克常数牛顿的引力常数
基本电荷
摩尔气体常数
或者 电子质量
在子包constants中,定义了一些科学计算经常会被用到的常数或常量。第 71 页
11.3.1 SciPy物理和数学常数
编号 常量 说明
或者质子质量
或中子质量
原子质量常数
弧度
一分钟秒数一天的秒数
一米的英寸数
一米的微米数
一光年的米数
在子包constants中,定义了一些科学计算经常会被用到的常数或常量。第 72 页
11.3.1 SciPy物理和数学常数
编号 常量 说明
帕斯卡标准大气压
一平方米的英亩数
一立方米的升数
一立方米的加仑数
公里每小时,以米秒为单位
一凯尔文的华氏数
一焦耳的电子伏特数
一瓦特的马力数
一牛顿的达因数
将波长转换为光频率
在子包constants中,定义了一些科学计算经常会被用到的常数或常量。第 73 页
11.3.2插值interpolate
插值是在离散数据的基础上补插连续函数,使得这条连续曲线通过
全部给定的离散数据点。 插值是离散函数逼近的重要方法,利用它可通
过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 5, 10) #在0到5之间生成10个数据
y = np.sin(x**2/3+8) #y是x的某种三角函数
plt.plot(x, y,‘o’) #使用matplotlib库生成图形
plt.show()第 74 页
11.3.2插值interpolate第 75 页
11.3.2插值interpolate
scipy.interpolate中的interp1d类,是一种创建基于固定数据点的函数的便捷
方法,可以使用插值方法在给定数据定义区域内的任意位置评估该函数。
f1 = interpolate.interp1d(x, y,kind = ‘linear’) #线性插值
f2 = interpolate.interp1d(x, y, kind = ‘quadratic’) # 2阶样条插值
xnew = np.linspace(0, 5,100)
plt.plot(x, y, ‘o’, xnew, f1(xnew), ‘-’, xnew, f2(xnew), '–'plt.show()第 76 页
11.3.2插值interpolate第 77 页
11.3.3图像处理
图像处理子包:ndimage
import numpy as np
import math
from matplotlib import pyplot as plt
from scipy import ndimage
im = np.zeros((256, 256))
im[60:-60, 60:-60] = 100 #在中间画出一个蓝色正方形
for i in range(0,256): #在中间画出一个黄色的圆形
for j in range(0,256):
if math.sqrt((i-128)**2+(j-128)**2)<= 60:
im[i,j]=200
plt.imshow(im)
plt.show()第 78 页
11.3.3图像处理第 79 页
11.3.3图像处理
使用ndimage中的gaussian_filter函数,对图像做模糊处理
im = ndimage.gaussian_filter(im, 8) #增加高斯模糊效果,
plt.imshow(im)
plt.show()11.3.3图像处理
用ndimage 中的sobel函数,对上述模糊的图像,进行边缘检测
sx = ndimage.sobel(im, axis = 0, mode = ‘reflect’)
sy = ndimage.sobel(im, axis = 1, mode = ‘reflect’)
sob = np.hypot(sx, sy)
plt.imshow(sob)
plt.show()