久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Python 數據分析基礎包:Numpy

     powerbaby 2016-02-17

    Numpy 的核心內容是它的多維數組對象——ndarray(N-Dimensions Array),整個包幾乎都是圍繞這個對象展開。Numpy 本身并沒有提供多么高級的數據結構和分析功能,但它是很多高級工具(如 pandas)構建的基礎,在結構和操作上具有統一性,因此理解 Numpy 的數組及面向數組的計算有助于更加高效地使用諸如 pandas 之類的工具。

    數據結構


    Numpy 的 ndarray 提供了一種將同質數據塊解釋為多維數組對象的方式。同質,表示數組的元素必須都是相同的數據類型(如 int,float 等);解釋,表示 ndarray 的數據塊其實是線性存儲的,并通過額外的元信息解釋為多維數組結構:

    在此輸入圖片描述

    下面是一個 3×4 的矩陣:(使用類似 3×4×2... 這種格式表示多維數組的結構時,從左向右的數字對應表示由表及里的維度,或稱為,按索引給軸編號后可稱為“軸 0”、“軸 1”等)

    
    >>> foo
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> foo.dtype
    dtype('int32')
    >>> foo.shape
    (3, 4)
    >>> foo.strides
    (16, 4)
    

    這個矩陣的形狀(shape)是(3,4)或 3×4,即它有 3 個長度為 4 的一維數組;它的 dtypeint32 表示它的單位元素是占 4 字節的整型;跨度(strides)元組指的是在某一維度下為了獲取到下一個元素需要“跨過”的字節數。可見跨度是可以由 形狀+dtype 來確定的。顯然這種同質的靜態數據結構在進行數值運算時效率要比 Python 內建的可以混雜動態類型的列表要快得多。

    dtype 支持的數字類型有:

    ###################### ***********************************
    bool_ 占一個字節的布爾類型(True/False)
    int_ 默認的整數類型
    intc 與 C int 相同,通常為 int32 或 int64
    intp 用于索引的整數(同 C ssize_t,int32 或 int64)
    int8、16、32、64 不同位數的整數
    uint8、16、32、64 不同位數的無符號整數
    float_ float64
    float16、32、64 不同位數的浮點數
    complex_ complex128
    complex64、128 不同位數的復數



    上表中加粗的 bool_ , int_ , float_ , complex_ 都與 Python 的內建類型 bool , int , float , complex 相同,實際上使用 Python 的類型名稱(int,float 等)也是合法的。intc , intp 的大小不定是取決于操作系統。

    創建 ndarray


    創建數組最簡單的方法是使用 array() 函數:(numpy 的公約簡稱為 np —— import numpy as np)

    
    array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
    

    它接受一切序列類型對象,并將其轉化為一個 ndarray 數組,維度視序列的嵌套深度而定:

    
    >>> np.array([1,2,3,4])
    array([1, 2, 3, 4])
    >>> np.array([[1,2],[3,4]])
    array([[1, 2],
           [3, 4]])
    

    數組的 dtype 會由系統自動推定,除非你顯式傳遞一個參數進去。(系統一般會默認使用 int32 或 float64)

    array() 函數外,還有一些可以用于創建數組的便捷函數:

    ##################### *************************************************
    asarray 將輸入轉換為 ndarray,若輸入本身是 ndarray 就不復制
    arange 類似于內建 range 函數,不過返回的是一個一維 ndarray
    ones、ones_like 根據指定形狀和 dtype 創建一個全 1 數組
    zeros、zeros_like 根據指定形狀和 dtype 創建一個全 0 數組
    empty、empty_like 創建新數組,但只分配內存空間不賦值
    eye、identity 創建一個正方的N×N單位矩陣(對角線為1,其余為0)



    ones(shape, dtype=None, order='C')ones_like(arr_instance, dtype=None, order='K', subok=True) 使用示例,zeros_like 取一個 ndarray 為參數,并按它的 dtype 和形狀創建全 0 數組:

    
    >>> foo = np.ones((3,4),dtype=np.int32)
    >>> foo
    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [1, 1, 1, 1]])
    >>> bar = np.zeros_like(foo)
    >>> bar
    array([[0, 0, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]])
    

    參數中的 order='C' ,order='F' 指的是元素在內存中的排序,C 代表 C 順序,指行優先;F 代表 Fortran 順序,指列優先。

    在 pandas 中盡量不要使用 np.empty(),這個函數創建的數組里面是有值的,除非你確定創建的這個數組能被完全賦值,否則后面運算起來很麻煩,這些“空值”的布爾類型是 True,而且 dropna() 方法刪不掉。想創建空的 Series ,可以使用 Series(np.nan,index=???) 這樣。

    ndarray 對象的屬性


    .reshape(shape)

    此方法用于改變數組的形狀。雖然我覺得既然 ndarray 對象的數據塊都是線性存儲的,按說調用 .reshape() 方法的話只需要改一下數據頭中的 shape 屬性就可以了啊,但實際上不是這樣子的!a.reshape(shape, order='C') 方法會返回一個新數組,而不是直接改變調用者的形狀。

    
    >>> foo = np.arange(9)
    >>> bar = foo.reshape((3,3))
    >>> bar
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> foo
    array([0, 1, 2, 3, 4, 5, 6, 7, 8])
    


    .astype(dtype)

    這是一個用于轉換數組 dtype 的方法,從前面的 ndarray 數據結構可以猜到,這種轉換必然需要創建一個新數組。如果轉換過程因為某種原因而失敗了,就會引發一個 TypeError 異常。另外,如 np.int32() 這樣把 dtype 當做函數來用也是可行的,但更推薦 .astype() 方法:

    
    >>> bar.astype(float)
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.],
           [ 6.,  7.,  8.]])
    

    本例中使用 Python 內建的 float 當做 dtype 傳了進去,也是可行的哦,當對數據大小不敏感時就可以這么做。

    .transpose(*axes)

    轉置方法返回的是原數組的視圖(不復制)。因為我對多維數組也搞不太懂,就只舉個二維數組的例子吧(不給 axes 參數):

    
    >>> foo = np.arange(8).reshape(2,4)
    >>> foo
    array([[0, 1, 2, 3],
           [4, 5, 6, 7]])
    >>> foo.transpose()
    array([[0, 4],
           [1, 5],
           [2, 6],
           [3, 7]])
    >>> foo.T
    array([[0, 4],
           [1, 5],
           [2, 6],
           [3, 7]])
    

    數組的 .T 屬性是軸對換的快捷方式。一般在計算矩陣點積時比較方便:np.dot(arr,att.T)。嗯,簡單的乘法(星號)是廣播運算,點積需要使用 dot() 函數。

    .sort()

    ndarray 的 .sort(axis=-1, kind='quicksort', order=None) 方法可用于給數組在指定軸向上排序。比如一個 (4,3,2)的數組,它的對應軸向分別為(2,1,0),方法默認的 axis=-1 代表最外層維度,如 “表” 里的 “行”。

    
    >>> a = np.array([[1,4], [3,1]])
    >>> a
    array([[1, 4],
           [3, 1]])
    >>> np.sort(a,0)
    array([[1, 1],
           [3, 4]])
    >>> np.sort(a,1)
    array([[1, 4],
           [1, 3]])
    

    這里使用了外部函數 np.sort() 是為了在演示過程中不會影響到原數組。np.sort() 函數總是返回一份拷貝,而 .sort() 方法則會更改原數組。

    統計方法

    ndarray 對象還有一些統計方法,可以對整個數組或某個軸向上的數據進行統計計算(軸向數字越大代表的維度越高,從 0 開始計數)。這些方法同時也可以當做頂級函數使用。例如:

    
    >>> arr = np.arange(12).reshape(3,4)
    >>> arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> arr.sum()
    66
    >>> np.sum(arr)
    66
    >>> arr.mean(0)
    array([ 4.,  5.,  6.,  7.])
    >>> arr.mean(1)
    array([ 1.5,  5.5,  9.5])
    >>> arr.mean(2)
    Traceback (most recent call last):
      File "<pyshell#35>", line 1, in <module>
        arr.mean(2)
        items *= arr.shape[ax]
    IndexError: tuple index out of range
    

    基本的數組統計方法有:

    ##################### *************************************************
    sum 求和
    mean 均值
    std,var 標準差和方差
    min,max 最小值和最大值
    argmin,argmax 最小值和最大值的索引
    cumsum 累積和
    cumprod 累積積


    用于布爾型數組的方法

    有兩個方法 .any().all() 可以用于判斷某個數組中是否存在或全部為 True。這兩個方法也同樣支持 axis 軸向參數:

    
    >>> arr = np.arange(12).reshape(3,4)
    >>> arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> arr.all(1)
    array([False,  True,  True], dtype=bool)
    >>> arr.any()
    True
    


    數組之間的運算


    形狀相同的數組之間的運算都會應用到元素級:

    lang:python
    >>> foo = np.arange(6).reshape((2,3))
    >>> bar = np.arange(5,-1,-1).reshape((2,3))
    >>> bar
    array([[5, 4, 3],
           [2, 1, 0]])
    >>> foo
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> foo + bar
    array([[5, 5, 5],
           [5, 5, 5]])
    >>> foo * bar
    array([[0, 4, 6],
           [6, 4, 0]])
    

    真正的問題在于不同大小的數組間運算時會發生什么。廣播(broadcasting)指的是不同形狀的數組之間的算數運算的執行方式,這也是 Numpy 的核心內容之一。

    廣播遵循的原則為:如果兩個數組的后緣維度(trailing dimension,即從末尾開始算起的維度)的軸長度相符或其中一方的長度為 1,則認為它們是廣播兼容的。廣播會在缺失和(或)長度為 1 的維度上進行。

    嗯,反正我是沒看明白 ╮(╯▽╰)╭ 。自己的理解是,系統會在可能的條件下把形狀不同的數組補完成相同的形狀,例:

    
    >>> foo = np.arange(5)
    >>> foo
    array([0, 1, 2, 3, 4])
    >>> foo * 5
    array([ 0,  5, 10, 15, 20])
    

    這里系統就會自動把 5 補完成 array([5, 5, 5, 5, 5])

    索引和切片


    ndarray 的索引和切片語法與 Python 的列表相似。都是通過如 [0][0:5:2] 這樣的方括號 + 冒號來完成。比較不同之處在于為了方便對多維數組切片,ndarray 對象還支持使用逗號間隔的多維切片方法:[0,3][0,3:9:2]

    普通索引

    
    >>> foo = np.arange(12)
    >>> foo
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    >>> foo[:5]
    array([0, 1, 2, 3, 4])
    >>> foo[:5]=0
    >>> foo
    array([ 0,  0,  0,  0,  0,  5,  6,  7,  8,  9, 10, 11])
    >>> bar = foo[:5]
    >>> bar[0] = 1024
    >>> foo
    array([1024,  0,  0,  0,  0,  5,  6,  7,  8,  9, 10, 11])
    

    注意這里,為了節省內存,對 ndarray 的切片操作獲得的都是對原數組的引用,因此對該引用的更改操作都會反映到原數組上。如果你想復制出一段副本,就應當使用 .copy() 方法:

    
    >>> bar = foo[:5].copy()
    >>> bar[:] = 1
    >>> foo
    array([1024,  0,  0,  0,  0,  5,  6,  7,  8,  9, 10, 11])
    

    也許你會對這里的 foo[:] 感興趣,這代表切全部的片,不可以使用 foo = 1 這樣的賦值語句,這等于給 foo 重新指向一個新的內存地址,而非對切片元素進行操作。

    前面提到的使用逗號在多維度下的切片方法:

    
    >>> foo = np.arange(12).reshape(3,4)
    >>> foo
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> foo[0,1]
    1
    >>> foo[0,::2]
    array([0, 2])
    

    這種切片方法可以看做是一種語法糖,因為最標準的對多維數組的切片方法應該是下面這樣子的,包括 Python 原本對嵌套列表的切片方法也是這樣子的:

    
    >>> foo
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> foo[0][1]
    1
    >>> foo[0][::2]
    array([0, 2])
    

    foo[0,1]foo[0][1] 效果相同,這種實現可以節省時間,但不如原始方法更直觀一點。只要記住對多維數組的單層切片總是切的最外層維度這點,操作起來就不容易亂。

    布爾型索引

    布爾型索引指的是使用一個布爾型數組而非 [::] 作為切片手段,操作會將被切片對象中對應于布爾型數組中 True 元素位置的元素返回,并總是返回一個新的副本

    
    >>> foo = np.arange(12).reshape(3,4)
    >>> bar = foo.copy()
    >>> bar%2==0
    array([[ True, False,  True, False],
           [ True, False,  True, False],
           [ True, False,  True, False]], dtype=bool)
    >>> foo[bar%2==0]
    array([ 0,  2,  4,  6,  8, 10])
    

    本例中一個值得注意之處在于 bar%2==0 這個表達式,在 Python 的標準語法中對一個列表和一個整型應用取余操作是非法的,你必須使用循環(如 for)遍歷列表的單個元素才行。但 numpy 很貼心地通過廣播解決了這個問題,吊不吊!

    花式索引


    花式索引(fancy indexing)是一個 Numpy 術語,它指的是利用整數數組進行索引,這里的整數數組起到了index的作用。

    
    >>> foo = np.empty((8,4),int)
    >>> for i in range(8):
            foo[i] = i
    
    
    >>> foo
    array([[0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4],
           [5, 5, 5, 5],
           [6, 6, 6, 6],
           [7, 7, 7, 7]])
    >>> foo[[7,2,5]]
    array([[7, 7, 7, 7],
           [2, 2, 2, 2],
           [5, 5, 5, 5]])
    >>> foo[[7,2,5],[0,2,2]]
    array([7, 2, 5])
    

    上例中 foo[[7,2,5],[0,2,2]] 處兩個列表索引之間的逗號,所起的作用與上面普通索引處的作用相同,均為在更低一級維度上索引之用。

    通用函數


    通用函數(即 ufunc)是一種對 ndarray 執行元素級運算的函數。通用函數依據參數的數量不同,可分為一元(unary)函數和二元(binary)函數。(參數一般都是 ndarray 對象)

    一元函數

    abs,fabs 整數、浮點、復數的絕對值,對于非復數,可用更快的 fabs
    sqrt 平方根,等于 arr**0.5
    square 平方,等于 arr**2
    exp 以 e 為底的指數函數
    log,log10,log2,log1p 以 e 為底的對數函數
    sign 計算各元素的正負號,1(正),0(零),-1(負)
    ceil 計算大于等于該值的最小整數
    floor 計算小于等于該值的最大整數
    rint round int,四舍五入到整數
    modf 將數組的整數和小數部分以兩個獨立數組的形式返回
    isnan 返回一個 “哪些值是 NaN” 的布爾型數組
    isfinite,isinf 返回是否是有窮(無窮)的布爾型數組
    cos,cosh,sin,sinh,tan,tanh 普通和雙曲型三角函數
    arccos,arccosh...等同上 反三角函數
    logical_not 計算個元素 not x 的真值,等于 -arr
    unique 計算元素唯一值并返回排序后的結果


    二元函數

    add 加法,+
    subtract 減法,-
    multiply 乘法,*
    divide,floor_divide 除法和地板除,/ 和 //
    power 乘方,**
    maximum,fmax 元素級最大值,fmax 將忽略 NaN
    minimum,fmin 同上
    mod 取模,%
    copysign 將第二數組元素的符號復制給第一數組
    greater(_equal),less(_equal),(not_)equal 字面意義,返回布爾數組
    logical_and,logical_or,logical_xor 字面意義,返回布爾數組


    三元函數

    這里的三元函數只有一個,而且不是接受 3 個數組參數的意思。它其實是一個條件運算函數,即 foo if cond else bar 這個表達式的 numpy 版——where(condition, [x, y])

    
    >>> arr = np.arange(12).reshape(3,4)
    >>> arr
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    >>> np.where(arr%2==0,1,0)
    array([[1, 0, 1, 0],
           [1, 0, 1, 0],
           [1, 0, 1, 0]])
    

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲中文字幕无码中字| 国产AV无区亚洲AV麻豆| 午夜精品久久久久成人| 精品少妇av蜜臀av| 又大又爽又硬的曰皮视频| 久久久久99精品国产片| 老司机午夜精品视频资源| 亚洲中文字幕无码不卡电影 | 在厨房被C到高潮A毛片奶水| 美女把尿囗扒开让男人添| 好男人社区影视在线WWW| 亚洲A成人片在线播放| 艳女性享受在线观看| 亚洲精品国自产拍在线观看| 少妇私密推油呻吟在线播放| 全国最大成人网站| 国产成人无码A区在线观| 中文字幕人成乱码中文乱码| 色狠狠色噜噜AV一区| 国产AV无区亚洲AV麻豆| 亚洲色大成网站WWW国产| 在线播放深夜精品三级| 国产精品福利自产拍在线观看| 在线中文一区字幕对白| 野花免费社区在线| 加勒比无码人妻东京热| 中文有无人妻VS无码人妻激烈| 少妇午夜啪爽嗷嗷叫视频| 久久人与动人物a级毛片 | 国产精品中文字幕日韩| 无码少妇高潮浪潮AV久久| 久久香蕉国产线看观看怡红院妓院| 亚洲国产精品福利片在线观看| 天堂V亚洲国产V第一次| 香蕉伊蕉伊中文在线视频| 中文字幕在线亚洲精品| 暖暖日本手机免费观看中文| 免费无码又爽又刺激软件下载| 国产精品无码一区二区三区电影| 麻豆国产成人AV在线播放| 少妇熟女久久综合网色欲|