5.1 什么事模块
模块是最高级别的程序语言,能够把程序代码和数据封装起来。模块的导入是import语句
- import numpy:自动导入NumPy模块
- import numpy as np: 导入NumPy模块命名为np
- from numpy import array : 从NumPy模块导入其他arry.
5.2 NumPy
一个科学计算的基础模块,不但能够完成科学计算,也能完成有效的多维数据容器,存储大量和处理大型矩阵。可以保存任意数据类型,所以就可以无缝并且快速整合各种数据。
1.创建数组
如下是一个实例:
import numpy as np # 导入模块
print '''创建数组'''
arr1 = np.array([2,3,4]) # 通过列表创建数组
arr2 = np.array([(1.3,9,2.0),(7,6,1)]) # 通过元组创建数组
arr3 = np.zeros((2,3)) # 通过元组(2, 3)生成全零矩阵
arr4 = np.identity(3) # 生成3维的单位矩阵
arr5 = np.random.random(size = (2,3)) # 生成每个元素都在[0,1]之间的随机矩阵
arr6 = np.arange(5,20,3) # 生成等距序列,参数为起点,终点,步长值.含起点值,不含终点值
arr7 = np.linspace(0,2,9) # 生成等距序列,参数为起点,终点,步长值.含起点值和终点值
print arr1
# result:
# [2 3 4]
print arr2
# result:
# [[ 1.3 9. 2. ]
# [ 7. 6. 1. ]]
print arr3
# result:
# [[ 0. 0. 0.]
# [ 0. 0. 0.]]
print arr4
# result:
# [[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]
print arr5
# result:
# [[ 0.31654004 0.87056375 0.29050563]
# [ 0.55267505 0.59191276 0.20174988]]
print arr6
# result: [ 5 8 11 14 17]
print arr7
# result: [ 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
print '-'*70
2.访问数据
在科学计算中,我们需要频繁访问数组元素。通过Numpy索引,切片,和迭代器的方法能够快速灵活访问数据,如下:
print '''访问数组'''
# 查看数组的属性
print arr2.shape # 返回矩阵的规格
# result: (2,3)
print arr2.ndim # 返回矩阵的秩
# result: 2
print arr2.size # 返回矩阵元素总数
# result: 6
print arr2.dtype.name # 返回矩阵元素的数据类型
# result: float64
print type(arr2) # 查看整个数组对象的类型
# result: <type 'numpy.ndarray'>
# 通过索引和切片访问数组元素
def f(x,y):
return 10*x+y
arr8 = np.fromfunction(f,(4,3),dtype = int)
print arr8
# result:
# [[ 0 1 2]
# [10 11 12]
# [20 21 22]
# [30 31 32]]
print arr8[1,2] #返回矩阵第1行,第2列的元素(注意下标从0开始)
# result: 12
print arr8[0:2,:] #切片,返回矩阵前2行
# result:
# [[ 0 1 2]
# [10 11 12]]
print arr8[:,1] #切片,返回矩阵第1列
# result: [ 1 11 21 31]
print arr8[-1] #切片,返回矩阵最后一行
# reuslt: [30 31 32]
# 通过迭代器访问数组元素
for row in arr8:
print row
# result:
# [0 1 2]
# [10 11 12]
# [20 21 22]
# [30 31 32]
for element in arr8.flat:
print element
# 输出矩阵全部元素
print '-'*70
3.数组的运算
运算符针对于整个数组,所以比起for 更优秀。如下(如果NumPy是一个矩阵,还支持求逆,转置等操作):
arr9 = np.array([[2,1],[1,2]])
arr10 = np.array([[1,2],[3,4]])
print arr9 - arr10
# result:
# [[ 1 -1]
# [-2 -2]]
print arr9**2
# result:
# [[4 1]
# [1 4]]
print 3*arr10
# result:
# [[ 3 6]
# [ 9 12]]
print arr9*arr10 #普通乘法
# result:
# [[2 2]
# [3 8]]
print np.dot(arr9,arr10) #矩阵乘法
# result:
# [[ 5 8]
# [ 7 10]]
print arr10.T #转置
# result:
# [[1 3]
# [2 4]]
print np.linalg.inv(arr10) #返回逆矩阵
# result:
# [[-2. 1. ]
# [ 1.5 -0.5]]
print arr10.sum() #数组元素求和
# result: 10
print arr10.max() #返回数组最大元素
# result: 4
print arr10.cumsum(axis = 1) #沿行累计总和
# result:
# [[1 3]
# [3 7]]
print '-'*70
4.Numpy的通过元素
数学中的sin/cos 都NumPy都称为通用函数(Universal Functions),通用函数针对的是一个数组,所以不需要都每一个数组都进行重新操作。
print '''NumPy通用函数'''
print np.exp(arr9) #指数函数
# result:
# [[ 7.3890561 2.71828183]
# [ 2.71828183 7.3890561 ]]
print np.sin(arr9) #正弦函数(弧度制)
# result:
# [[ 0.90929743 0.84147098]
# [ 0.84147098 0.90929743]]
print np.sqrt(arr9) #开方函数
# result:
# [[ 1.41421356 1. ]
# [ 1. 1.41421356]]
print np.add(arr9,arr10) #和arr9+arr10效果一样
# result:
# [[3 3]
# [4 6]]
print '-'*70
5.数组的分割和合并
print '''数组合并与分割'''
# 合并
arr11 = np.vstack((arr9,arr10)) #纵向合并数组,由于与堆栈类似,故命名为vstack
print arr11
# result:
# [[2 1]
# [1 2]
# [1 2]
# [3 4]]
arr12 = np.hstack((arr9,arr10)) #横向合并数组
print arr12
# result:
# [[2 1 1 2]
# [1 2 3 4]]
# 分割
print np.hsplit(arr12,2) # 将数组横向分为2部分
# result:
# [array([[2, 1],
# [1, 2]]), array([[1, 2],
# [3, 4]])]
print np.vsplit(arr11,2) # 数组纵向分为2部分
# result:
# [array([[2, 1],
# [1, 2]]), array([[1, 2],
# [3, 4]])]
常用的NumPy方法
方法 | 效果和用途 | 返回类型 |
np.empty | 返回给定模块的一个数组 | NumPy数组类型 |
np.all | 测试是否为Ture | Ture False |
np.any | 是否至少有一个Ture | Ture False |
np.average | 计算加权平均数 | NumPy数组类型 |
np.nonzero | 返回数组非0元素的位置 | 记录位置元素 |
np.sort | 位置排序 | NumPy数组类型 |
op.var | 方差 | NumPy数组类型 |
np.where | 返回数组满足条件的元素 | NumPy数组类型 |
np.reshape | 转换数组的规模,不要更改数据内容 | NumPy数组类型 |
np.eye | 生成单位矩阵 | NumPy数组类型 |
np.transpose | 矩阵转置,与.T相同 | NumPy数组类型 |
np.std | 计算标准差 | NumPy数组类型 |
np.cov | 给定数据和权重计算协方差矩阵 | NumPy数组类型 |
5.3 Pandas
强大的数据分析和处理工具。能够分析以下复杂类型数据:
- 数据库或者excel表
- 时间序列类型数据,包含有序 无序
- 任意的矩阵/二维表/观测统计数据,允许独立行和带标签
清洗数据>>>分析和建模>>>组织分析的结果>>>>展示
官方建议模块导入语法: import pandas as pd
1. pandas中的高级数据结构
系列(series )and 数据框(Dataframe)
2.Datafram
与矩阵相似,但是不同。数据框有行列的索引值(index)。
创建数据框:
-*- coding:utf-8 -*-
import pandas as pd # 为pandas取一个别名pd
data = {'id': ['Jack', 'Sarah', 'Mike'],
'age': [18, 35, 20],
'cash': [10.53, 500.7, 13.6]}
df = pd.DataFrame(data) # 调用构造函数并将结果赋值给df
print df
# result:
# age cash id
# 0 18 10.53 Jack
# 1 35 500.70 Sarah
# 2 20 13.60 Mike
由于没有显式声明,行索引自动分配,并且对列名进行了排序,下列应用了pd.DataFrame更高级的参数设置,声明了索引值。
df2 = pd.DataFrame(data, columns=['id', 'age', 'cash'],index=['one', 'two', 'three'])
print df2
# result:
# id age cash
# one Jack 18 10.53
# two Sarah 35 500.70
# three Mike 20 13.60
获取数据框的某一行是十分方便的,我们只需要呼唤他的名字。
print df2['id']
# result:
# 0 Jack
# 1 Sarah
# 2 Mike
# Name: id, dtype: object
3.系列
以上代码其实得到了一个系列。服从某种分布,系列是一种退化的数据框,也可以认为是一种广义的一维数组。默认的情况下,系列的索引是自增非负的整数列(0,1,2,3,。。。)。同一个系列的数据共享一个列名,而数组不要求。在时间序列(Time Series),有宝贵的价值。
s = pd.Series({'a': 4, 'b': 9, 'c': 16}, name='number')
print s
# result:
# a4
# b9
# c16
# Name: number, dtype: int64
4. 基础数据的处理方法。
应该首先关注系列的处理方法。
print s[0]
# result: 4
print s[:3]
# result:
# a 4
# b 9
# c 16
# Name: number, dtype: int64
类似于数组,系列支持索引访问,也支持类似字典的访问模式。-----按键值(列名)访问。
print s['a']
# result: 4
s['d'] = 25 # 如果系列中本身没有这个键值,则会新增一行
print s
# result:
# a 4
# b 9
# c 16
# d 25
# Name: number, dtype: int64
同时,也支持向量化操作。意思就是我们能够对一个系列的所有值进行同样的操作。
import numpy as np
print np.sqrt(s)
# result:
# a 2.0
# b 3.0
# c 4.0
# d 5.0
# Name: number, dtype: float64
print s*s
# result:
# a 16
# b 81
# c 256
# d 625
# Name: number, dtype: int64
数据框也可以看做一个字典