數據分析 之 NumPy


簡單了解數據分析

  • 數據分析(是把隱藏在一些看似雜亂無章的數據背后的信息提煉出來,總結出所研究對象的內在規律)

數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。
這一過程也是質量管理體系的支持過程。在實用中,數據分析可幫助人們作出判斷,以便采取適當行動。
數據分析的數學基礎在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)
#執行結果如 下圖

學習網站

作 者: 郭楷豐
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角 推薦一下。您的鼓勵是博主的最大動力!
自 勉:生活,需要追求;夢想,需要堅持;生命,需要珍惜;但人生的路上,更需要堅強。 帶着感恩的心啟程,學會愛,愛父母,愛自己,愛朋友,愛他人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM