Numpy模塊

ndarray是一個通用的同構數據多維容器,也就是說所有的元素必須是相同數據類型的。

基本屬性

  • ndarray.ndim 維度(秩)
  • ndarray.shape n行m列則爲(n,m)
  • ndarray.size 元素個數n*m
  • ndarray.dtype 數據類型 int32, int16, float64……..

常用函數

arange,linspace,reshape,resize,ravel,flatten,

(ravel和flatten兩者所要實現的功能是一致的(將多維數組降位一維),兩者的區別在於返回拷貝(copy)還是返回視圖(view),numpy.flatten()返回一份拷貝,對拷貝所做的修改不會影響(reflects)原始矩陣,而numpy.ravel()返回的是視圖,會影響(reflects)原始矩陣。)

numpy常用統計函數和計算函數

all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod(累乘), cumsum(累加), diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median(中值), min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where,sin,cos,exp

  • np.sum(),返回求和
  • np.mean(),返回均值
  • np.max(),返回最大值
  • np.min(),返回最小值
  • np.ptp(),數組沿指定軸返回最大值減去最小值,即(max-min)
  • np.std(),返回標準偏差(standard deviation)
  • np.var(),返回方差(variance)
  • np.cumsum(),返回累加值
  • np.cumprod(),返回累乘積值

請注意函數在使用時需要指定axis軸的方向,若不指定,默認統計整個數組。

創建ndarray

1.使用array函數,它接受一切序列型的對象,包括其他ndarray對象。(除非顯式說明,np.array會嘗試爲新建的數組推斷出較爲合適的的數據類型)

>>> a = [1,2,1.1,3,4]
>>> arr_a = np.array(a)
>>> arr_a.dtype
dtype('float64')
>>> arr_a
array([ 1. ,  2. ,  1.1,  3. ,  4. ])
>>> b = ([1,2,3],(4,5,6,))
>>> arr_b = np.array(b)
>>> arr_b.dtype
dtype('int32')   #這個應該和解釋器有關
>>> arr_b
array([[1, 2, 3],
       [4, 5, 6]])

2.zeros和ones也可以創建ndarray,empty可以創建一個沒有任何具體值的數組(一般爲垃圾值)。

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

       [[ 1.,  1.],
        [ 1.,  1.],
        [ 1.,  1.]]])
>>> np.zeros((2,2)).dtype
dtype('float64')
>>> 

沒有特別指定,數據類型基本都是float64.
這裏寫圖片描述

ndarray的數據類型

這裏寫圖片描述這裏寫圖片描述
顯式的創建數組:

>>> x = np.array([1,2,3,4],dtype=np.float64)
>>> x
array([ 1.,  2.,  3.,  4.])
>>> y = x.astype(np.int64)  #顯式的轉換數據類型
>>> y
array([1, 2, 3, 4], dtype=int64)

注意:調用astype無論如何都會創建一個新的數組(原始數據的一份拷貝)。

數組和標量之間的運算

大小相等的數組之間的任何算數運算都會將運算應用到元素級。和標量的運算也會對每個元素進行運算。

>>> arr = np.array([[1,2,3],[4,5,6]])
>>> arr * arr
array([[ 1,  4,  9],
       [16, 25, 36]])
>>> 1/arr
array([[ 1.        ,  0.5       ,  0.33333333],
       [ 0.25      ,  0.2       ,  0.16666667]])      
>>> arr ** 0.5
array([[ 1.        ,  1.41421356,  1.73205081],
       [ 2.        ,  2.23606798,  2.44948974]])

大小不同的數組之間的運算叫做廣播(broadcasting)。見後文。
如果想進行矩陣乘法的話可以用dot函數來運算。

>>> a = np.arange(12).reshape(3,4)
>>> b = np.arange(12).reshape(4,3)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> b
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>> np.dot(a,b)
array([[ 42,  48,  54],
       [114, 136, 158],
       [186, 224, 262]])

基本的索引和切片

和列表操作差不多。也有一個很重要的區別,數組切片是原始數組的視圖,也就是說數據不會被複制,視圖上的任何修改都會直接改變原始數據。

>>> arr
array([[1, 2, 3],
       [4, 5, 6]])
>>> arr[1]
array([4, 5, 6])
>>> arr[1] = 5 #這個就叫廣播,自動傳播到每一個數據
>>> arr[1]
array([5, 5, 5])
>>> arr
array([[1, 2, 3],
       [5, 5, 5]])
>>> arr = np.arange(36).reshape(3,3,4)
>>> arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]],

       [[24, 25, 26, 27],
        [28, 29, 30, 31],
        [32, 33, 34, 35]]])
>>> arr[1,2]  #還可以這麼玩
array([20, 21, 22, 23])    

布爾型索引

>>> import numpy as np
>>> names = np.array(['Bob','Joe','Tom','Amy','Bob'])
>>> names
array(['Bob', 'Joe', 'Tom', 'Amy', 'Bob'], 
      dtype='<U3')
>>> names == 'Bob' #前面說過,會對每個元素進行運算
array([ True, False, False, False,  True], dtype=bool)
>>> data = np.arange(20).reshape(5,4)
>>> data
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
>>> data[names == 'Bob'] #布爾型索引
array([[ 0,  1,  2,  3],
       [16, 17, 18, 19]])
>>> mask = (names == 'Bob') or (names=='Tom') #and和or在布爾型數組中無效,要用 & 和 | 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> mask = (names == 'Bob') | (names=='Tom')
>>> mask
array([ True, False,  True, False,  True], dtype=bool)

堆疊數組

  • vstack(vertical stack)垂直堆疊
  • hstack(horizontal stack)水平堆疊
  • dstack 深度堆疊
  • column_stack 以列將一維數組合成二維數組,等同與 vstack 對一維數組。
  • row_stack 將一維數組以行組合成二維數組。
>>> a = np.arange(6).reshape(2,3)
>>> b = np.arange(7,13).reshape(2,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
>>> v_stack = np.vstack((a,b))
>>> h_stack = np.hstack((a,b))
>>> v_stack
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> h_stack
array([[ 0,  1,  2,  7,  8,  9],
       [ 3,  4,  5, 10, 11, 12]])
>>> np.dstack((a,b))  #自己體會
array([[[ 0,  7],
        [ 1,  8],
        [ 2,  9]],

       [[ 3, 10],
        [ 4, 11],
        [ 5, 12]]])
>>> con_stack = np.concatenate((a,b,a,b),axis=1)
>>> con_stack
array([[ 0,  1,  2,  7,  8,  9,  0,  1,  2,  7,  8,  9],
       [ 3,  4,  5, 10, 11, 12,  3,  4,  5, 10, 11, 12]])
>>> con_stack2 = np.concatenate((a,b,a,b),axis=0)
>>> con_stack2
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12],
       [ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12]])

分割數組

  • split 指定軸分割,默認axis=0,即vsplit
  • array_split 可以進行不等分割
  • hsplit 水平分割
  • vsplit 垂直分割
  • dsplit 深度分割
>>> arr = np.arange(12).reshape(3,4)
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> x,y = np.split(arr,2,axis=1) #必須能分割成相等大小的幾塊,不然會出錯
>>> x
array([[0, 1],
       [4, 5],
       [8, 9]])
>>> y
array([[ 2,  3],
       [ 6,  7],
       [10, 11]])
>>> i,j,k = np.split(arr,3,axis=0)
>>> i
array([[0, 1, 2, 3]])
>>> j
array([[4, 5, 6, 7]])
>>> k
array([[ 8,  9, 10, 11]])

複製和視圖

  1. 完全不拷貝(不拷貝的意思就是不復制數據,操作的是同一份數據)
    • 簡單的賦值不拷貝數組對象或它們的數據。
    • 函數調用不拷貝數組

>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> b = a
>>> c = a
>>> d = c
>>> d is a #都是同一個對象,同一份數據
True
>>> b is a
True
>>> c is a
True
>>> def f(x):
...     x += x
... 
>>> b = f(a)
>>> a  #a會改變
array([[ 0,  2,  4],
       [ 6,  8, 10]])
  1. 視圖(view)和淺複製

不同的數組對象分享同一個數據。視圖方法創造一個新的數組對象指向同一數據。

>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> c = a.view() #新的對象,但是共用同一份數據
>>> c
array([[0, 1, 2],
       [3, 4, 5]])
>>> c[0][0] = 100
>>> a
array([[100,   1,   2],
       [  3,   4,   5]])
>>> c
array([[100,   1,   2],
       [  3,   4,   5]])
>>> c is a  #不同的對象
False
  1. 深複製(完全複製數組和它的數據。)

這個複製方法完全複製數組和它的數據。

>>> a
array([[100,   1,   2],
       [  3,   4,   5]])
>>> b = a.copy() #b和a沒有關係了
>>> b is a
False
>>> b[0][0] = 0
>>> b
array([[0, 1, 2],
       [3, 4, 5]])
>>> a
array([[100,   1,   2],
       [  3,   4,   5]])

函數和方法(method)總覽

創建數組

arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like

轉換

astype, atleast 1d, atleast 2d, atleast 3d, mat

操作

array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack

詢問

all, any, nonzero, where

排序

argmax, argmin, argsort, max, min, ptp, searchsorted, sort

運算

choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum

基本統計

cov, mean, std, var

基本線性代數

cross, dot, outer, svd, vdot

廣播法則(rule)

廣播法則能使通用函數有意義地處理不具有相同形狀的輸入。

廣播第一法則是,如果所有的輸入數組維度不都相同,一個“1”將被重複地添加在維度較小的數組上直至所有的數組擁有一樣的維度。

廣播第二法則確定長度爲1的數組沿着特殊的方向表現地好像它有沿着那個方向最大形狀的大小。對數組來說,沿着那個維度的數組元素的值理應相同。

應用廣播法則之後,所有數組的大小必須匹配。更多細節可以從這個 文檔 找到。

花式索引

比較花,用到的時候再學。

參考鏈接:

  1. http://www.tuicool.com/articles/r2yyei
  2. https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
  3. https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/
  4. http://www.cnblogs.com/lemonbit/p/7043879.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章