(一) numpy模塊


 

Numpy模塊

一.什么是數據分析

  簡單來講數據分析就是是把隱藏在一些看似雜亂無章的數據背后的信息提煉出來,總結出所研究對象的內在規律。在數據分析的學習過程中,我們主要圍繞着被稱為數據分析三劍客的這三個模塊展開講解,分別是Numpy模塊、Pandas模塊、Matplatlib模塊。

二.Numpy模塊

  概念:NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。

  創建Numpy

1. 使用np.array()函數創建

#導入numpy的包
import numpy as np
#創建一個基於一維numpy數組
np.array([1,2,3,4,5])
#創建一個基於二維numpy數組
np.array([[1,2,3],[4,'a',6],[6,7,8]])

注意:
- numpy默認ndarray的所有元素的類型是相同的
- 如果傳進來的列表中包含不同的類型,則統一為同一類型,優先級:str>float>int 

- 創建一個numpy數組,數組的數據源來自於一張圖片數據

#導入繪圖模塊
import matplotlib.pyplot as plt
#將圖片數據進行加載,返回一個多維的numpy數組
img_arr = plt.imread('cat.jpg')
#將數組中的數據,用圖形的方式進行展示
plt.imshow(img_arr)

2. 使用np的roustines函數創建

包含以下常見創建方法:
參數介紹:
    - shape表示數組的形狀,類型為元組或列表
    - dtype表示數組元素的數據類型

1) np.ones(shape, dtype=None, order='C')創建一個形狀為shape的數組,數組元素為1 
2) np.zeros(shape, dtype=None, order='C')創建一個形狀為shape的數組,數組元素為0
3) np.full(shape, fill_value, dtype=None, order='C')創建一個形狀為shape的數組,數組元素為fill_value
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)創建一個一維數組,數組元素為等差數列
6) np.arange([start, ]stop, [step, ]dtype=None)創建一個一維數組
7) np.random.randint(low, high=None, size=None, dtype='l')創建一個形狀為shape的數組,數組元素為隨機值
8) np.random.randn(d0, d1, ..., dn)  標准正太分布
9) np.random.random(size=None)  生成0到1的隨機數,左閉右開      

3. numpy的屬性

  ndim:返回數組的維度數

  shape:返回一個元組,表示數組的形狀

  size:返回數組長度

  dtype:返回數組元素的數據類型

4. numpy的索引操作:numpy的一維數組於python列表用法完全一致,多維同理

5. numpy的切片操作:numpy的一維數組於python列表用法完全一致,多維同理

#創建一個numpy數組
arr = np.random.randint(60,120,size=(6,4))
#獲取該二維數組的前兩行
arr[0:2]
#獲取二維數組前兩列
arr[:,0:2]   #,左邊表示的是行,右邊是列
#獲取二維數組前兩行和前兩列數據
arr[0:2,0:2]
#將數組的行倒序
arr[::-1]
#列倒序
arr[:,::-1]
#全部倒序
arr[::-1,::-1]

使用切片將圖片進行倒置操作

#加載圖片數據到img_arr的numpy數組中
img_arr = plt.imread('./cat.jpg')
#查看該圖片的形狀
img_arr.shape #該屬性返回的值為(456, 730, 3),表示該數組為三維。456和730表示的是該圖片的像素,3表示圖片的顏色
#展示該張圖片
plt.imshow(img_arr)
#將該圖片的進行上下左右倒置
plt.imshow(img_arr[::-1,::-1,:])

6. 變形操作:使用arr.reshape()函數,注意參數是一個tuple!

#將二維數組變形成一維數組
arr = np.array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109]])
#reshape的參數表示的是變形后數組的形狀
new_arr = arr.reshape(6*4)
#將一維數組變形成三維數組
new_arr.reshape(2,4,3)

拓展:reshape(-1,2)表示將數組變形成二維數組,變形后的數組的列數為2,行數為-1,-1表示根據列數自動計算出行數

7. 級聯操作:np.concatenate(),在numpy中,級聯表示的是將多個numpy數組根據指定規則進行橫向或者縱向的拼接操作。

arr = np.array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109]])
#將arr和arr進行級聯操作。
#axis=0:軸向 0表示的是豎直的軸向 1水平的軸向
np.concatenate((arr,arr),axis=1)

#級聯后返回的結果為:
array([[ 83, 105,  62,  94,  83, 105,  62,  94],
       [110, 111,  71,  64, 110, 111,  71,  64],
       [108,  91,  65,  73, 108,  91,  65,  73],
       [107, 101, 109, 106, 107, 101, 109, 106],
       [ 67, 101,  80, 113,  67, 101,  80, 113],
       [119,  74,  89, 109, 119,  74,  89, 109]])

不匹配級聯:

#創建一個形狀為3行4列的二維數組
arr1 = np.random.randint(0,100,size=(3,4))
#將arr和arr1進行縱向級聯,arr的形狀為6行4列
np.concatenate((arr,arr1),axis=0)

#接連后的結果為:
array([[ 83, 105,  62,  94],
       [110, 111,  71,  64],
       [108,  91,  65,  73],
       [107, 101, 109, 106],
       [ 67, 101,  80, 113],
       [119,  74,  89, 109],
       [ 47,  58,  97,  30],
       [ 16,  15,   4,  63],
       [  0,  15,  73,  95]])

#思考如果將arr1和arr進行橫向級聯會怎樣呢?
np.concatenate((arr,arr1),axis=1) #會報錯,因為兩個數組的行數不一致,無法匹配級聯。

np.hstack與np.vstack跟np.concatnate一樣,都是用作於級聯,只不過前兩個方法的參數中午axis參數。hstack表示橫向級聯,vstack表示縱向級聯

級聯需要注意的點:

- 級聯的參數是列表:一定要加中括號或小括號
- 維度必須相同
- 形狀相符:在維度保持一致的前提下,如果進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。如果進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。
- 可通過axis參數改變級聯的方向

8. 切分

與級聯類似,三個函數完成切分工作:
- np.split(arr,行/列號,軸):參數2是一個列表類型
- np.vsplit
- np.hsplit
#創建一個數組
np.random.seed(10)#固定時間種子,其作用為可以使得random產生的隨機數固定下來
num_arr = np.random.randint(60,100,size=(5,6))
#將num_arr在列索引為2,3的位置進行切分,則原數組被切分成了三分
np.split(num_arr,[2,3],axis=1)
#將num_arr在行索引為2,3的位置進行切分,則原數組被切分成了三分
np.split(num_arr,[2,3],axis=0)

9. 副本:在numpy中,所有賦值運算不會為numpy數組的任何元素創建副本。對賦值后的對象的操作也對原來的對象生效。

arr = np.array([1,2,3,4,5])
#為arr創建了一個副本a
a = arr.copy()
#對a進行賦值操作,不會影響arr本身
a[1] = 10

10. numpy的聚合操作

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 冪運算

11. 廣播機制

【重要】ndarray廣播機制的三條規則:
    規則一:為缺失的維度補1(進行運算的兩個數組之間的維度只能相差一個維度)
    規則二:缺失元素用已有值填充
    規則三:缺失維度的數組只能有一行或者一列
根據廣播機制三條准則,對如下案例進行練習:

例1:
m = np.ones((2, 3))
a = np.arange(3)
求m+a

例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b

12. 排序

np.sort()與ndarray.sort()都可以,但有區別:

    - np.sort()不改變輸入
    - ndarray.sort()本地處理,不占用空間,但改變輸入


np.partition(a,k)有的時候我們不是對全部數據感興趣,我們可能只對最小或最大的一部分感興趣。

當k為正時,我們想要得到最小的k個數
當k為負時,我們想要得到最大的k個數

 


免責聲明!

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



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