Day02 基礎篇(三)用NumPy快速處理數據

1、爲何使用numpypython

  一、它是Python中使用最多的第三方庫,它的數據結構比python自身的數據結構更加高效算法

  二、標準Python中用列表保存數組數值的方式實際上是存放了指針與其對應的數據類型對象,對於Python來講浪費了內存和計算時間。數組

  三、標準Python中列表在系統內存中分散存儲,NumPy數組存儲在連續均勻內存塊中,遍歷元素時不須要對內存地址進行查找。數據結構

  四、NumPy直接利用現代CPU的矢量化指令計算,加載寄存器中的多個連續浮點數。多線程

  五、NumPy的矩陣計算能夠採用多線程模式充分利用多核CPU計算資源。ide

  注:使用Numpy時要注意使用規則提升內存利用率:避免採用隱式拷貝而採用就地操做,即採用x*=2而不要使用y= x*2函數

 

2、ndarray對象(處理多維數組問題)ui

  一、定義:spa

    (1)維數:指秩(rank),一維數組秩爲1,二維數組秩爲2線程

    (2)軸(axes):每個線性數組稱爲一個軸,秩用以描述軸的數量

  二、ndarray對象

    ndarray是多維數組的含義,一般用其建立數組、處理結構數組。

    (1)建立數組

import numpy as np

a = np.array([1,2,3])
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
#修改對應索引元素值
b[1,1] = 10
#shape表示a數組的大小,dtype表示a數組元素的屬性
print(a.shape)
print(b.shape)
print(a.dtype)
print(b)

 

 

 

    (2)結構數組

      與C語言中的結構體相似,存儲包含不一樣數據類型的字段。

import numpy as np
# 用dtype定義結構類型
persontype = np.dtype({'names':['name','age','chinese','math','english'],
                       'formats':['S32','i','i','i','f']})
peoples = np.array([('ZhangFei',32,75,100,90),('GuanYu',24,85,96,88.5)
                      ,('ZhaoYun',28,85,92,96.5),('HuangZhong',29,65,85,100)],
                  dtype=persontype)
ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs= peoples[:]['english']
print(np.mean(ages))
print(np.mean(chineses))
print(np.mean(maths))
print(np.mean(englishs))

 

 

 

  三、ufunc運算

    ufunc可以對數組中每一個元素進行函數操做,用unfunc計算速度快的緣由是運算都是採用C語言實現的。

    (1)連續數組建立

      arange和linspace的做用都是建立等差數組,arange()是經過初始值、終值和步長來建立等差數列的一維數組,左閉右開。

      linspace是經過初始值、終值和元素個數來建立等差數列的一維數組的,左閉右閉。

 

import numpy as np

x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print(x1)
print(x2)

 

   

  (2)算數運算

      解決兩數組之間加、減、乘、除以及n次方和取餘操做

import numpy as np

x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print(x1)
print(x2)
print("=====================")
print(np.add(x1,x2))
print(np.subtract(x1,x2))
print(np.multiply(x1,x2))
print(np.divide(x1,x2))
#n次方操做,其中x1爲基數,x2爲次方
print(np.power(x1,x2))
#取餘也可用mod表示
print(np.remainder(x1,x2))

 

 

  四、統計函數中本身關於axis的心得體會

    在剛開始看axis的時候, 翻了不少資料,看了不少人的解釋,最後我想用本身算是比較笨的方法掌握axis,我將它稱爲座標法,網上有個大佬說的很精闢:設axis=i,則numpy沿着第i個下標變化的方向進行操做。

    對以上這句話我本身的理解是將維數轉化成座標來表示,將數組轉化爲座標來表示,你就能很清晰的理解這句話,有幾個座標位就要看對應有幾個維度。好比是二維,那麼座標的開頭就爲D00,若是有三個就是D000,依次類推。

    (1)對於二維數組個人作法(看代碼註釋你必定明白了,關鍵要注意把下標標好,最好每一行都標出來)

import numpy as np

#建立二維數組
np_data = np.array([[1,2,3],    #D00~D02
                    [4,5,6]])   #D10~D12
#若是axis爲0,則是沿下標0(就是D後的第一個0)的變化(只能產生一個變化),例如:D00->D10,D01->D11,D02->D12
print(np.sum(np_data,axis=0))

    (2)對於三維數組個人作法

import numpy as np

#建立二維數組
np_data = np.array([[[[3, 5, 5, 0],  # D0000  ->   D0003
         [0, 1, 2, 4],     # D0010  ->   D0013
         [0, 5, 0, 5]],    # D0020  ->   D0023

         [[5, 5, 0, 0],    # D0100  ->   D0103
          [2, 1, 5, 0],    # D0110  ->   D0113
          [1, 0, 0, 1]]],  # D0120  ->   D0123

       [[[0, 5, 1, 2],     # D1000  ->   D1003
         [4, 4, 2, 2],     # D1010  ->   D1013
         [3, 5, 0, 1]],    # D1020  ->   D1023

        [[5, 1, 2, 1],     # D1100  ->   D1103
         [2, 2, 3, 5],     # D1110  ->   D1113
         [5, 3, 3, 3]]],   # D1120  ->   D1123

       [[[2, 4, 1, 4],     # D2000  ->   D2003
         [1, 4, 1, 4],     # D2010  ->   D2013
         [4, 5, 0, 2]],    # D2020  ->   D2023

        [[2, 5, 5, 1],     # D2100  ->   D2103
         [5, 3, 0, 2],     # D2110  ->   D2113
         [4, 0, 1, 3]]],   # D2120  ->   D2123

       [[[1, 3, 4, 5],     # D3000  ->   D3003
         [0, 2, 5, 4],     # D3010  ->   D3013
         [2, 3, 5, 3]],    # D3020  ->   D3023

        [[2, 2, 2, 2],     # D3100  ->   D3103
         [3, 2, 1, 3],     # D3110  ->   D3113
         [0, 3, 0, 1]]]])  # D3120  ->   D3123
#若是axis爲0,則是沿下標0(就是D後的第一個0,維度最高位)的變化(只能產生一個變化),例如:D0000->D1000、D2000、D3000、D4000
print(np.sum(np_data,axis=0))

 

 

  五、統計函數總結

    (1)最大值函數amax(arrary,axis=)和最小值函數amin(arrary,axis=)

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#求數組中的最小元素
print(np.amin(a))
#按axis爲0求數組中的最小元素
print(np.amin(a,0))
#按axis爲1求數組中的最小元素
print(np.amin(a,1))
#amax同理
print(np.amax(a))
print(np.amax(a,0))
print(np.amax(a,1))

 

 

    (2)統計最大值與最小值之差ptp()

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#求數組中的最小元素和最大元素之差
print(np.ptp(a))
#按axis爲0求數組中的最小元素和最大元素之差
print(np.ptp(a,0))
#按axis爲1求數組中的最小元素和最大元素之差
print(np.ptp(a,1))

 

 

    (3)百分位數

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#尋找中位數
print(np.percentile(a,50))
print(np.percentile(a,50,axis = 0))
print(np.percentile(a,50,axis = 1))

 

 

    (4)中位數median()和平均數mean()

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#尋找中位數
print(np.median(a))
print(np.median(a,axis = 0))
print(np.median(a,axis = 1))
#尋找平均數
print(np.mean(a))
print(np.mean(a,axis = 0))
print(np.mean(a,axis = 1))

 

 

    (5)加權平均值average()

        經過weights來設置元素的權值(用另一個數組來對應不一樣元素的權值),加權平均就是元素數值乘以對應的權重之和再除以權重之和所得就是加權平均值,默認每一個元素的權重都是相同的都是1。

import numpy as np
a = np.array([1,2,3,4])
wts = np.array([1,2,3,4])
print(np.average(a))
print(np.average(a,weights=wts))

 

 

    (6)標準差std(),方差var()

import numpy as np
a = np.array([1,2,3,4])
print(np.std(a))
print(np.var(a))

 

 

    (7)numpy中的排序

      排序算法須要使用到sort函數,標準格式爲sort(a,axis=x,kind = 'xxx',order=x),kind中能夠制定排序的種類,好比:quicksort、mergesort、heapsort分別表示快速排序、合併排序和推排序,axis默認爲-1,就是沿着最後一個座標進行排序,axis=None表明採用扁平化的方式做爲一個向量進行排序(就是變成一維數組進行排序),order對於結構化的數組能夠制定按照某個字段進行排序。

import numpy as np
a = np.array([[4,3,2],[2,4,1]])
print (np.sort(a))
print (np.sort(a, axis=None))
print (np.sort(a, axis=0))
print (np.sort(a, axis=1))

相關文章
相關標籤/搜索