1. 程式人生 > >帶你深入AI(7)- 深度學習重要Python庫

帶你深入AI(7)- 深度學習重要Python庫

系列文章,請多關注
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。其子模組主要有。

  1. scipy.cluster:向量量化
  2. scipy.constants: 數學物理常量
  3. scipy.fftpack:fft傅立葉變換
  4. scipy.integrate: 積分
  5. scipy.interpolate 插值
  6. scipy.io: 資料輸入輸出
  7. scipy.linalg: 線性代數程式
  8. scipy.ndimage: n維影象包
  9. scipy.optimize: 優化相關
  10. scipy.signal: 訊號處理
  11. scipy.sparse: 稀疏矩陣
  12. 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庫