目錄
簡單了解數據分析
-
數據分析(是把隱藏在一些看似雜亂無章的數據背后的信息提煉出來,總結出所研究對象的內在規律)
數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。
這一過程也是質量管理體系的支持過程。在實用中,數據分析可幫助人們作出判斷,以便采取適當行動。
數據分析的數學基礎在20世紀早期就已確立,但直到計算機的出現才使得實際操作成為可能,並使得數據分析得以推廣。
數據分析是數學與計算機科學相結合的產物。
Python數據分析三劍客(Numpy,Pandas,Matplotlib)
-
NumPy
NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協作者共同開發,2005 年,Travis Oliphant 在 Numeric 中結合了另一個同性質的程序庫 Numarray 的特色,
並加入了其它擴展而開發了 NumPy。NumPy 為開放源代碼並且由許多協作者共同維護開發。
NumPy 是一個運行速度非常快的數學庫,主要用於數組計算,包含:
一個強大的N維數組對象 ndarray
廣播功能函數
整合 C/C++/Fortran 代碼的工具
線性代數、傅里葉變換、隨機數生成等功能
Numpy常用函數用法大全目錄
#Numpy常用函數用法大全目錄
A
array 創建一個np數組
arange 返回指定范圍內的數組
argmax 返回沿軸axis最大值的索引
B
bincount 返回數組中的值中索引出現的次數
C
copysign 將b中各元素的符號賦值給數組a的對應元素
D
dot 矩陣運算
E
exp e的N次方
F
full 返回給定形狀和類型的新數組,填充fill_value
G
gradient 返回N維數組的梯度
H
hsplit 通過指定要返回的相同shape的array的數量,或者通過指定分割應該發生之后的列來沿着其橫軸拆分原array
I
isnan 測試NaN的元素,並將結果作為布爾數組返回
L
log e的指數
linspace 在指定的間隔內返回均勻間隔的數字
M
max 數組中最大的鍵
R
reshape 不改變數據同時改變數據格式
random.choice 隨機分布一個數組
random.randn 返回一個或一組樣本,具有標准正態分布
S
sum 每個數組各個鍵的總和
v
vsplit 沿着垂直軸分割,其分割方式與hsplit用法相同
Z
zeros_like 生成0填充形狀和傳入數組相同的數組
zeros 返回來一個給定形狀和類型的用0填充的數組
-
Pandas
pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標准的數據模型,
提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,
它是使Python成為強大而高效的數據分析環境的重要因素之一。
-
Matplotlib
Matplotlib 是一個 Python 的 2D繪圖庫,它以各種硬拷貝格式和跨平台的交互式環境生成出版質量級別的圖形。
通過 Matplotlib,開發者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等。
簡單使用np.array()
-
安裝NumPy pip3 install numpy
-
一維數組創建
import numpy as np #as np別名方便調用
np.array([1,2,3,4,5])
#執行結果 所有代碼使用的是Jupyter Notebook執行,所以沒有print
array([1, 2, 3, 4, 5])
-
二維數組創建
import numpy as np
np.array([[1,2,3],[4,5,6]])
#執行結果
array([[1, 2, 3],
[4, 5, 6]])
np.array([[1,1.2,3],[4,5,'six']])
#執行結果
array([['1', '1.2', '3'],
['4', '5', 'six']], dtype='<U32')
-
注意
- numpy默認ndarray的所有元素的類型是相同的
- 如果傳進來的列表中包含不同的類型,則統一為同一類型,優先級:str>float>int
使用np的routines函數創建數組
-
np.linspace 等差數列
import numpy as np
np.linspace(1,100,num=10)
#執行結果
array([ 1., 12., 23., 34., 45., 56., 67., 78., 89., 100.])
-
np.arange 使用步長
import numpy as np
np.arange(0,100,2)
#執行結果
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66,
68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98])
-
np.random.randint 隨機數組
# 隨機原理
# - 隨機因子:表示的是一個無時無刻都在變化的數值(比如時間)
import numpy as np
np.random.seed(10)#指定隨機因子
np.random.randint(0,100,size=(4,5))
#執行結果 不會變
array([[ 9, 15, 64, 28, 89],
[93, 29, 8, 73, 0],
[40, 36, 16, 11, 54],
[88, 62, 33, 72, 78]])
#np.random.seed(10) 不指定隨機因子
np.random.randint(0,100,size=(4,5))
#執行結果 第一次
array([[49, 51, 54, 77, 69],
[13, 25, 13, 92, 86],
[30, 30, 89, 12, 65],
[31, 57, 36, 27, 18]])
#執行結果 第二次
array([[93, 77, 22, 23, 94],
[11, 28, 74, 88, 9],
[15, 18, 80, 71, 88],
[11, 17, 46, 7, 75]])
#執行結果 第三次
array([[28, 33, 84, 96, 88],
[44, 5, 4, 71, 88],
[88, 50, 54, 34, 15],
[77, 88, 15, 6, 85]])
np.random.random(size=(5,3))
#執行結果
array([[0.82110566, 0.15115202, 0.38411445],
[0.94426071, 0.98762547, 0.45630455],
[0.82612284, 0.25137413, 0.59737165],
[0.90283176, 0.53455795, 0.59020136],
[0.03928177, 0.35718176, 0.07961309]])
ndarray N維數組對象
NumPy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器,該對象由兩部分組成:
- 實際的數據;
- 描述這些數據的元數據;
大部分的數組操作僅僅是修改元數據部分,而不改變其底層的實際數據。數組的維數稱為秩,簡單來說就是如果你需要獲取數組中一個特定元素所需的坐標數,
如a是一個2×3×4的矩陣,你索引其中的一個元素必須給定三個坐標a[x,y,z],故它的維數就是3。而軸可以理解為一種對數組空間的分割,以數組a為例,
如果我們以0為軸,那么a可以看成是一個由兩個元素構成的數組,其中每個元素都是一個3×4的數組。
我們可以直接將數組看作一種新的數據類型,就像list、tuple、dict一樣,但數組中所有元素的類型必須是一致的,Python支持的數據類型有整型、
浮點型以及復數型,但這些類型不足以滿足科學計算的需求,因此NumPy中添加了許多其他的數據類型,如bool、inti、int64、float32、complex64等。
同時,它也有許多其特有的屬性和方法。
常用ndarray屬性:
dtype 描述數組元素的類型
shape 以tuple表示的數組形狀
ndim 數組的維度
size 數組中元素的個數
itemsize 數組中的元素在內存所占字節數
T 數組的轉置
flat 返回一個數組的迭代器,對flat賦值將導致整個數組的元素被覆蓋
real/imag 給出復數數組的實部/虛部
nbytes 數組占用的存儲空間
常用ndarray方法:
reshape(…) 返回一個給定shape的數組的副本
resize(…) 返回給定shape的數組,原數組shape發生改變
flatten()/ravel() 返回展平數組,原數組不改變
astype(dtype) 返回指定元素類型的數組副本
fill() 將數組元素全部設定為一個標量值
sum/Prod() 計算所有數組元素的和/積
mean()/var()/std() 返回數組元素的均值/方差/標准差
max()/min()/ptp()/median() 返回數組元素的最大值/最小值/取值范圍/中位數
argmax()/argmin() 返回最大值/最小值的索引
sort() 對數組進行排序,axis指定排序的軸;kind指定排序算法,默認是快速排序
view()/copy() view創造一個新的數組對象指向同一數據;copy是深復制
tolist() 將數組完全轉為列表,注意與直接使用list(array)的區別
compress() 返回滿足條件的元素構成的數組
ndarray的基本操作
索引
import numpy as np
#准備
arr = np.random.randint(60,120,size=(6,8))
arr
#執行結果 數組
array([[102, 68, 86, 84, 80, 104, 90, 77],
[112, 92, 113, 82, 99, 91, 92, 83],
[ 84, 93, 81, 111, 86, 75, 88, 71],
[114, 101, 77, 111, 67, 73, 91, 64],
[ 90, 101, 73, 73, 92, 84, 107, 96],
[115, 102, 116, 81, 66, 83, 88, 72]])
arr[1] #直結索引取到的是 行
#執行結果
array([112, 92, 113, 82, 99, 91, 92, 83])
arr[1][2]#直結索引再索引 取到的是 某行的某個元素
#執行結果
113
#小結:一維與列表完全一致 多維時同理
切片
#還是沿用上邊的數據
array([[102, 68, 86, 84, 80, 104, 90, 77],
[112, 92, 113, 82, 99, 91, 92, 83],
[ 84, 93, 81, 111, 86, 75, 88, 71],
[114, 101, 77, 111, 67, 73, 91, 64],
[ 90, 101, 73, 73, 92, 84, 107, 96],
[115, 102, 116, 81, 66, 83, 88, 72]])
#獲取二維數組前兩行
arr[0:2]# 直接切片取得是行 取先不取后
#執行結果
array([[102, 68, 86, 84, 80, 104, 90, 77],
[112, 92, 113, 82, 99, 91, 92, 83]])
#獲取二維數組前兩列
arr[:,0:2]# 應用了逗號的機制,逗號左邊為第一個維度(行),右邊為第二個維度(列) :代表不對行做操作
#執行結果
array([[102, 68],
[112, 92],
[ 84, 93],
[114, 101],
[ 90, 101],
[115, 102]])
#獲取二維數組前兩行和前三列數據
arr[0:2,0:3] #逗號 左邊行 右邊列
#執行結果
array([[102, 68, 86],
[112, 92, 113]])
#將數組的行倒序
arr[::-1]
#執行結果
array([[115, 102, 116, 81, 66, 83, 88, 72],
[ 90, 101, 73, 73, 92, 84, 107, 96],
[114, 101, 77, 111, 67, 73, 91, 64],
[ 84, 93, 81, 111, 86, 75, 88, 71],
[112, 92, 113, 82, 99, 91, 92, 83],
[102, 68, 86, 84, 80, 104, 90, 77]])
#全部倒序
arr[::-1,::-1]
#執行結果
array([[ 72, 88, 83, 66, 81, 116, 102, 115],
[ 96, 107, 84, 92, 73, 73, 101, 90],
[ 64, 91, 73, 67, 111, 77, 101, 114],
[ 71, 88, 75, 86, 111, 81, 93, 84],
[ 83, 92, 91, 99, 82, 113, 92, 112],
[ 77, 90, 104, 80, 84, 86, 68, 102]])
變形 (arr.reshape() 機器學習會用到)
#使用arr.reshape()函數,注意參數是一個tuple!
#准備數據
import numpy as np
arr = np.random.randint(60,120,size=(6,8))
arr
array([[101, 67, 88, 94, 75, 82, 105, 96],
[100, 86, 112, 69, 79, 100, 65, 114],
[ 72, 86, 95, 84, 112, 94, 103, 115],
[ 83, 110, 78, 60, 67, 86, 113, 92],
[ 74, 118, 79, 86, 63, 97, 81, 106],
[112, 118, 83, 105, 72, 78, 94, 88]])
#將數組改成一維數組
arr.reshape((48,))
#執行結果 一個中括號是一維 注意變形元素總數量不能改變,不然會報錯
array([101, 67, 88, 94, 75, 82, 105, 96, 100, 86, 112, 69, 79,
100, 65, 114, 72, 86, 95, 84, 112, 94, 103, 115, 83, 110,
78, 60, 67, 86, 113, 92, 74, 118, 79, 86, 63, 97, 81,
106, 112, 118, 83, 105, 72, 78, 94, 88])
#修改數組,不改變維數
arr.reshape((48,1))
#執行結果
array([[101],
[ 67],
[ 88],
[ 94],
[ 75],
[ 82],
[105],
[ 96],
[100],
[ 86],
[112],
[ 69],
[ 79],
[100],
[ 65],
[114],
[ 72],
[ 86],
[ 95],
[ 84],
[112],
[ 94],
[103],
[115],
[ 83],
[110],
[ 78],
[ 60],
[ 67],
[ 86],
[113],
[ 92],
[ 74],
[118],
[ 79],
[ 86],
[ 63],
[ 97],
[ 81],
[106],
[112],
[118],
[ 83],
[105],
[ 72],
[ 78],
[ 94],
[ 88]])
arr.reshape((-1,48))
#執行結果
array([[101, 67, 88, 94, 75, 82, 105, 96, 100, 86, 112, 69, 79,
100, 65, 114, 72, 86, 95, 84, 112, 94, 103, 115, 83, 110,
78, 60, 67, 86, 113, 92, 74, 118, 79, 86, 63, 97, 81,
106, 112, 118, 83, 105, 72, 78, 94, 88]])
arr.reshape((12,-1))#-1可以自動補齊
#執行結果
array([[101, 67, 88, 94],
[ 75, 82, 105, 96],
[100, 86, 112, 69],
[ 79, 100, 65, 114],
[ 72, 86, 95, 84],
[112, 94, 103, 115],
[ 83, 110, 78, 60],
[ 67, 86, 113, 92],
[ 74, 118, 79, 86],
[ 63, 97, 81, 106],
[112, 118, 83, 105],
[ 72, 78, 94, 88]])
arr.reshape((-1,12))
#執行結果
array([[101, 67, 88, 94, 75, 82, 105, 96, 100, 86, 112, 69],
[ 79, 100, 65, 114, 72, 86, 95, 84, 112, 94, 103, 115],
[ 83, 110, 78, 60, 67, 86, 113, 92, 74, 118, 79, 86],
[ 63, 97, 81, 106, 112, 118, 83, 105, 72, 78, 94, 88]])
#將數組改為三維
arr.reshape((2,4,6))
#執行結果
array([[[101, 67, 88, 94, 75, 82],
[105, 96, 100, 86, 112, 69],
[ 79, 100, 65, 114, 72, 86],
[ 95, 84, 112, 94, 103, 115]],
[[ 83, 110, 78, 60, 67, 86],
[113, 92, 74, 118, 79, 86],
[ 63, 97, 81, 106, 112, 118],
[ 83, 105, 72, 78, 94, 88]]])
級聯 (np.concatenate(),下面圖片修改有實際應用)
#一維,二維,多維數組的級聯,實際操作中級聯多為二維數組 (對一個或多個數組做拼接)
#准備數據
import numpy as np
arr = np.random.randint(60,120,size=(6,8))
arr
array([[101, 67, 88, 94, 75, 82, 105, 96],
[100, 86, 112, 69, 79, 100, 65, 114],
[ 72, 86, 95, 84, 112, 94, 103, 115],
[ 83, 110, 78, 60, 67, 86, 113, 92],
[ 74, 118, 79, 86, 63, 97, 81, 106],
[112, 118, 83, 105, 72, 78, 94, 88]])
np.concatenate((arr,arr),axis=1) # 軸向 0列 1行
#執行效果
array([[101, 67, 88, 94, 75, 82, 105, 96, 101, 67, 88, 94, 75,
82, 105, 96],
[100, 86, 112, 69, 79, 100, 65, 114, 100, 86, 112, 69, 79,
100, 65, 114],
[ 72, 86, 95, 84, 112, 94, 103, 115, 72, 86, 95, 84, 112,
94, 103, 115],
[ 83, 110, 78, 60, 67, 86, 113, 92, 83, 110, 78, 60, 67,
86, 113, 92],
[ 74, 118, 79, 86, 63, 97, 81, 106, 74, 118, 79, 86, 63,
97, 81, 106],
[112, 118, 83, 105, 72, 78, 94, 88, 112, 118, 83, 105, 72,
78, 94, 88]])
#級聯需要注意的點:
級聯的參數是列表:一定要加中括號或小括號
維度必須相同
形狀相符:在維度保持一致的前提下,如果進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。如果進行縱向(axis=0)級聯,
必須保證進行級聯的數組列數保持一致。
可通過axis參數改變級聯的方向
ndarray的聚合操作
#求和np.sum
arr.sum(axis=None)
#執行結果
4374
#最大最小值:np.max/ np.min
#平均值:np.mean()
Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 冪運算
ndarray的排序
np.sort()與ndarray.sort()都可以,但有區別:
- np.sort()不改變輸入
- ndarray.sort()本地處理,不占用空間,但改變輸入
#准備數據
import numpy as np
arr = np.random.randint(60,120,size=(6,8))
arr
array([[101, 67, 88, 94, 75, 82, 105, 96],
[100, 86, 112, 69, 79, 100, 65, 114],
[ 72, 86, 95, 84, 112, 94, 103, 115],
[ 83, 110, 78, 60, 67, 86, 113, 92],
[ 74, 118, 79, 86, 63, 97, 81, 106],
[112, 118, 83, 105, 72, 78, 94, 88]])
arr.sort(axis=0)#會作業到原始數據中 axis=0對每一列做排序
arr
#執行結果
array([[ 72, 67, 78, 60, 63, 78, 65, 88],
[ 74, 86, 79, 69, 67, 82, 81, 92],
[ 83, 86, 83, 84, 72, 86, 94, 96],
[100, 110, 88, 86, 75, 94, 103, 106],
[101, 118, 95, 94, 79, 97, 105, 114],
[112, 118, 112, 105, 112, 100, 113, 115]])
arr.sort(axis=1)#會作業到原始數據中 axis=0對每一行做排序
arr
#執行結果
array([[ 60, 63, 65, 67, 72, 78, 78, 88],
[ 67, 69, 74, 79, 81, 82, 86, 92],
[ 72, 83, 83, 84, 86, 86, 94, 96],
[ 75, 86, 88, 94, 100, 103, 106, 110],
[ 79, 94, 95, 97, 101, 105, 114, 118],
[100, 105, 112, 112, 112, 113, 115, 118]])
簡單使用matplotlib.pyplot獲取一個numpy數組,對其進行操作
-
准備
-
獲取一個numpy數組,簡單操作查看,展示圖片
# 使用matplotlib.pyplot獲取一個numpy數組,數據來源於一張圖片
import matplotlib.pyplot as plt
img_arr = plt.imread('./part_1/cat.jpg')
img_arr.shape#數組形狀
#執行結果
(456,730,3) #行,列,顏色,總個數是維度
img_arr.size#數組大小
#執行結果
998640 #多少元素
img_arr.dtype#數組類型
#執行結果
dtype('uint8')#數組類型, uint8是8位無符號整型
img_arr#查看數組
#執行結果 三位數組231, 186, 131前兩位數是像素點,后一位是顏色
array([[[231, 186, 131],
[232, 187, 132],
[233, 188, 133],
...,
[100, 54, 54],
[ 92, 48, 47],
[ 85, 43, 44]],
[[232, 187, 132],
[232, 187, 132],
[233, 188, 133],
...,
[100, 54, 54],
[ 92, 48, 47],
[ 84, 42, 43]],
#中間省略...
...,
[188, 98, 64],
[188, 95, 62],
[188, 95, 62]]], dtype=uint8)
plt.imshow(img_arr)#展示圖片
#執行結果 如下圖
-
數組減去某個值,圖片發生變化
import matplotlib.pyplot as plt
img_arr = plt.imread('./part_1/cat.jpg')
img_arr.ndim #當前數組維度
#執行結果
3
img_arr-100
#執行結果
array([[[131, 86, 31],
[132, 87, 32],
[133, 88, 33],
...,
[ 0, 210, 210],
[248, 204, 203],
[241, 199, 200]],
[[132, 87, 32],
[132, 87, 32],
[133, 88, 33],
...,
[ 0, 210, 210],
[248, 204, 203],
[240, 198, 199]],
#中間省略...
...,
[ 88, 254, 220],
[ 88, 251, 218],
[ 88, 251, 218]]], dtype=uint8)
plt.imshow(img_arr - 100)
plt.savefig('./mao.jpg') #保存圖片
#執行結果 如下圖
-
將圖片進行對稱反轉操作
import matplotlib.pyplot as plt
img_arr = plt.imread('./part_1/bcy.jpg')
plt.imshow(img_arr[:,::-1,:])
#執行結果如 下圖
-
將圖片倒置
plt.imshow(img_arr[::-1,:])
#執行結果如 下圖
-
將圖片對稱反轉並倒置
plt.imshow(img_arr[::-1,::-1])
#執行結果如 下圖
-
將圖片對稱反轉並倒置並修改顏色
plt.imshow(img_arr[::-1,::-1,::-1])
#執行結果如 下圖
-
對原圖做剪裁
plt.imshow(img_arr[450:600,95:330])
#執行結果如 下圖
-
對圖片進行拼接
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
plt.imshow(arr_3)
#執行結果如 下圖
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)#axis=1 軸向 行
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)#axis=0 軸向 列
plt.imshow(arr_9)
#執行結果如 下圖