系列文章,请多关注
Tensorflow源码解析1 – 内核架构和源码结构
自然语言处理1 – 分词
带你深入AI(1) - 深度学习模型训练痛点及解决方法
带你深入AI(2)- 深度学习激活函数,准确率,优化方法等总结
带你深入AI(3)- 物体分类领域:AlexNet VGG Inception ResNet mobileNet
带你深入AI(4)- 目标检测领域:R-CNN,faster R-CNN,yolo,SSD, yoloV2
带你深入AI(5)- 自然语言处理领域:RNN LSTM GRU
带你深入AI(6)- 详解bazel
带你深入AI(7)- 深度学习重要Python库
1 pandas
pandas用来读取csv等带有标签的列和索引,从中导入数据,并快速的对数据进行过滤和转换。
1.1 数据类型
分为Series和DataFrame两种。Series为一维的数据类型,每个元素都有自己的标签。
DataFrame为二维的,表格型的数据结构。
1.2 数据导入
df = pd.read_csv('uk_rain_2014.csv', header=0)
header指定了哪一行是列名,如果没有列名,则设置为None
1.3 数据读取
查看前 x 行的数据:
# Getting first x rows.
df.head(5)
查看最后几行:
# Getting last x rows.
df.tail(5)
查看列名
df.columns
查看总行数
len(df)
1.4 查看列和按列过滤
查看某一列,通过列名来获取
# Getting a column by label
df['question1']
过滤
# Filtering by multiple conditionals
df[(df.is_duplicated == 1) & (df.question2.str.startswith("花呗"))]
1.5 查看行
按照行号索引查看行,从0开始
# Getting a row via a numerical index
df.iloc[30]
df.iloc[0:2] 查看第0行和第一行
df.iloc[:2] 查看前两行,也就是第0行和第一行。等同于df.iloc[0:2]
按行号排序,可以升序也可以降序
df.sort_index().head(5)
df.sort_index(ascending=False).head(5) #inplace=True to apple the sorting in place
1.6 合并数据集
# 将两个相关联的数据集合并在一起
rain_jpn = pd.read_csv('jpn_rain.csv')
rain_jpn.columns = ['year', 'jpn_rainfall']
uk_jpn_rain = df.merge(rain_jpn, on='year') # on指定了需要合并的列
uk_jpn_rain.head(5)
1.7 保存数据集
# 保存数据集
df.to_csv('uk_rain.csv')
1.8 绘图
# 利用plot绘图
uk_jpn_rain.plot(x='year', y=['rain_octsep', 'jpn_rainfall'])
2 numpy
2.1 数组的创建
# 一维数组创建
a = np.array([0, 1, 2, 3, 4]) # [0 1 2 3 4]
c = np.arange(5) # [0 1 2 3 4] 连续数组
d = np.linspace(0, 2*np.pi, 5) # [ 0. 1.57079633 3.14159265 4.71238898 6.28318531]
# 多维数组创建
a = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28 ,29, 30],
[31, 32, 33, 34, 35]])
print(a[2,4]) # >>>25
# 全1和全0
e = np.ones((4), dtype=np.int64) # array([1, 1, 1, 1]) 全1,形状为第一个参数shape,为一个元组
f = np.ones_like(a, dtype=np.float) # array([1., 1., 1., 1., 1.]) 全1,形状和数组a相同
g = np.zeros((4), dtype=np.int64) # array([0, 0, 0, 0]), 全0
h = np.zeros_like(a, dtype=np.float) # array([0., 0., 0., 0., 0.]) 全0
数组的索引和Pythonz中的list列表相同,也可以使用切片等功能。
2.2 ndarray的属性和数据类型
# 数组属性
print(type(a)) # >>><class 'numpy.ndarray'>
print(a.dtype) # >>>int64 # 每个数据的类型
print(a.size) # >>>25 # 总共多少个数据
print(a.shape) # >>>(5, 5) # 行列形状
print(a.itemsize) # >>>8 # 每个数据占用的字节数,因为是int64,故占8个字节
print(a.ndim) # >>>2 # 数组有多少维
print(a.nbytes) # >>>200
# np数据类型
np.int8 np.np.uint8, np.int16 np.uint16, np.int32 np.uint32, np.int64 np.uint64
np.float16, np.float32, np.float64, np.float128
np.complex64, np.complex128, np.complex256
np.bool
np.str
np.object
2.3 逐点运算
# 逐点进行加减乘除和乘方, 以及布尔运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9]
print(a - b) # [-3, -3, -3]
print(a * b) # [ 4, 10, 18]
print(a / b) # [0, 0, 0]
print(a ** 2) # [1, 4, 9]
print(a > b) # [False, False, False]
print(a < b) # [ True, True, True]
# 一元运算
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b = np.array([-1.1, -0.6, -0.5, -0.1, 0.1, 0.5, 0.6, 1.1])
np.abs(b) # 绝对值
np.sqrt(a) # 开方
np.square(a) # 平方 x^2
np.exp(a) # 指数e^x
np.log(a) # 对数 log(x)
np.sign(b) # 正负号
np.ceil(b) # 向上取整
np.floor(b) # 向下取整
np.round(b) # 浮点数四舍五入, array([-1., -1., -0., -0., 0., 0., 1., 1.])
np.cos(b) np.sin(b) np.tan(b) np.tanh(b) # 三角函数
np.arccos(b), np.arcsin(b), np.arctan(b) # 反三角函数
np.clip(a, 2, 5) # array([2, 2, 2, 3, 4, 5, 5, 5, 5, 5]), 最小值2, 最大值5
2.4 统计相关运算
a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sum(a) # 总和,45
np.min(a) # >>>0
np.max(a) # >>>9
np.mean(a) # 平均值 4.5
np.std(a) # 标准差 2.87
np.var(a) # 方差 8.25
np.argmin(a) np.argmax(a) # 最小值和最大值对应的下标
2.5 切片和索引
# 切片,行和列两个方向上分别切片即可。切片 [start: end(not include): step]
a = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28 ,29, 30],
[31, 32, 33, 34, 35]])
print(a[0, 1:4]) # >>>[12 13 14]
print(a[1:4, 0]) # >>>[16 21 26]
print(a[::2,::2]) # >>>[[11 13 15]
# [21 23 25]
# [31 33 35]]
print(a[:, 1]) # >>>[12 17 22 27 32]
# 布尔索引,返回为True的元素。也称条件索引
a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(a > 5) # [False, False, False, False, False, False, True, True, True, True]
print(a[a>5]) # [6, 7, 8, 9]
# where条件索引
print(np.where(a < 4)) # (array([0, 1, 2, 3]),)
print(np.where(a < 4)[0]) # array([0, 1, 2, 3])
2.6 集合运算
x = np.array([[1,6,2],[6,1,3],[1,5,2]])
y = np.array([1,6,5])
np.unique(x) # [1,2,3,5,6] x数组中的唯一数值
np.in1d(x, y) # [ True True False True True False True True False] x的元素是否包含于y中
np.setdiff1d(x, y) # [2, 3] 在x而不在y中的元素,也就是差集
np.intersect1d(x, y) # [1 5 6] 在x且在y中的元素,也就是交集
np.union1d(x, y) # [1, 2,3, 5, 6] 在x或在y中的元素,也就是并集
2.7 线性代数运算
x = np.array([[1,6,2],[6,1,3],[1,5,2]])
np.diag(x) # array([1, 1, 2]), 对角向量
np.trace(x) # 4, 对角向量的和
np.invert(x) # 逆矩阵,array([[-2, -7, -3], [-7, -2, -4], [-2, -6, -3]])
np.rank(x) # x, 矩阵的秩
np.ndim(x) # 2, 矩阵维度
np.dot(a, b) # 点乘, 对应位置元素相乘后在相加
2.8 随机数
利用np.random模块生成随机数
np.random.randint(start, end, size) # 产生start到end(不包含)范围内size个随机整数
np.random.normal(size=(2, 2)) # 生成正态分布 array([[ 0.72212515, -1.77705124],[-0.54233353, -0.53839069]])
np.random.uniform(size=(2, 2)) # 生成均匀分布 array([[0.34487134, 0.82949115],[0.32910195, 0.15248309]])
2.9 数组重塑(变形)
# 形状变换,可以从一维变为二维或三维
a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a.reshape(2, 5) # array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])
# 矩阵转置
a = np.array([[1, 2], [3, 4]])
a.tranpose() # array([[1, 3],[2, 4]]) 矩阵转置
# 拉平,变为一维
a.flatten() # [1, 2, 3, 4]
2.10 数组合并和拆分(concat, split)
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[7, 8, 9], [10, 11, 12]])
# concat连接,0表示行,1表示列。
np.concatenate([x,y], axis=0) # array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[10, 11, 12]])
np.concatenate([x,y], axis=1) # array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 10, 11, 12]])
# vstack垂直堆叠,可以理解为按行concat。hstack水平堆叠,可以理解为按列concat
np.vstack((x, y)) # array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[10, 11, 12]])
np.hstack((x, y)) # array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 10, 11, 12]])
# split分隔,0表示按行,1表示按列
np.split(x, 2, axis=0) # [array([[1, 2, 3]]), array([[4, 5, 6]])]
np.split(x, 3, axis=1) # [array([[1],[4]]), array([[2],[5]]), array([[3],[6]])]
3 matplotlib
绘图就不多说了,知道几个API就够了
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 50)
plt.plot(x, np.sin(x)) # 绘图,告知x轴和y轴即可。如果没有输入x轴,则将数组的index作为x轴
plt.plot(x, np.sin(2*x))
plt.hist(x, 50) # 绘制直方图
plt.close("all") # 关闭绘图
4 scipy
scipy包含了科学计算中常见的各个工具箱,其子模块十分丰富,可以看做是Python版的MATLAB。其子模块主要有。
- scipy.cluster:矢量量化
- scipy.constants: 数学物理常量
- scipy.fftpack:fft傅里叶变换
- scipy.integrate: 积分
- scipy.interpolate 插值
- scipy.io: 数据输入输出
- scipy.linalg: 线性代数程序
- scipy.ndimage: n维图像包
- scipy.optimize: 优化相关
- scipy.signal: 信号处理
- scipy.sparse: 稀疏矩阵
- scipy.stats: 统计
5 其他
5.1 gensim
Python自然语言处理库,将文档根据model转换为词向量表示。
5.2 itertools
操作迭代对象
5.3 jieba
分词工具,有精确模式(默认)、全模式和搜索引擎模式三种模式。
全模式是能分多少词就分多少。
import jieba
a = u'花呗还款什么时候。'
cut= jieba.cut(a)
print ",".join(cut) # 花,呗,还款,什么,时候,。
5.4 pickle
对象持久化用的
pickle.dump(obj, file[, protocol])
pickle.load(file)
系列文章,请多关注
Tensorflow源码解析1 – 内核架构和源码结构
自然语言处理1 – 分词
带你深入AI(1) - 深度学习模型训练痛点及解决方法
带你深入AI(2)- 深度学习激活函数,准确率,优化方法等总结
带你深入AI(3)- 物体分类领域:AlexNet VGG Inception ResNet mobileNet
带你深入AI(4)- 目标检测领域:R-CNN,faster R-CNN,yolo,SSD, yoloV2
带你深入AI(5)- 自然语言处理领域:RNN LSTM GRU
带你深入AI(6)- 详解bazel
带你深入AI(7)- 深度学习重要Python库