[python]-數據科學庫Numpy學習

1、Numpy簡介:

Python中用列表(list)保存一組值,能夠用來看成數組使用,不過因爲列表的元素能夠是任何對象,所以列表中所保存的是對象的指針。這樣爲了保存一個簡單的[1,2,3],須要有3個指針和三個整數對象。對於數值運算來講這種結構顯然比較浪費內存和CPU計算時間。此外Python還提供了一個array模塊,array對象和列表不一樣,它直接保存數值,和C語言的一維數組比較相似。可是因爲它不支持多維,也沒有各類運算函數,所以也不適合作數值運算。html

NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文統一稱之爲數組)是存儲單一數據類型的多維數組,而ufunc則是可以對數組進行處理的函數。python

2、nadrray對象:

一、建立一個數組對象:

  • 函數生成:ones(),zeros(),eye(),diag()......
    • zeros:(4),zeros((5,2))生成全0的數組
    • >>> import numpy as np
      >>> np.zeros(5) //一維 array([ 0., 0., 0., 0., 0.]) >>> np.zeros((5,2))//二維 array([[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]])

       >>> np.zeros((5,2,2))//三維
        array([[[ 0., 0.],
                [ 0., 0.]],數組

               [[ 0., 0.],
                [ 0., 0.]],dom

               [[ 0., 0.],
                [ 0., 0.]],函數

               [[ 0., 0.],
                [ 0., 0.]],spa

               [[ 0., 0.],
                [ 0., 0.]]]).net

    • ones():生成全1的數組
    • >>> import numpy as np
      >>> np.ones(10) //一維 array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) >>> np.ones(10,dtype="int32")//一維 array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

        >>> np.ones((4,1)) //二維
        array([[ 1.],
               [ 1.],
               [ 1.],
               [ 1.]])指針

    • arange函數:相似於list的range函數,經過指定初始值,終值,和步長來生成一維數組。(不包括終值)
    • import numpy as np
      d = np.arange(0,10,1) e = np.arange(0,10,2) print (d) #---------------------------------- [0 1 2 3 4 5 6 7 8 9] [0 2 4 6 8]
    • linspace函數:經過指定初始值,終值和 元素個數來建立一維數組。(默認包含終值,可用endpoint關鍵字指定包含終值)
    • f = np.linspace(0,10,11,endpoint=False)
      print (f)
      #----------------------------------------
      [ 0.          0.90909091  1.81818182  2.72727273  3.63636364  4.54545455
        5.45454545  6.36363636  7.27272727  8.18181818  9.09090909]
    • logspace函數:相似linspace建立等比數列,下面的例子產生1(10^0)到100(10^2)、有20個元素的等比數列:
    • g = np.logspace(0,2,20)
      print (g)
      [   1.            1.27427499    1.62377674    2.06913808    2.6366509
          3.35981829    4.2813324     5.45559478    6.95192796    8.8586679
         11.28837892   14.38449888   18.32980711   23.35721469   29.76351442
         37.92690191   48.32930239   61.58482111   78.47599704  100.        ]
    • frombuffer,fromstring,fromfile等函數能夠從字節序列建立數組。python自負產是字符序列,每一個字符佔一個字節,所以若是從字符串s建立一個8bit的整數數組的話獲得的每一個元書就是字符的ascii碼值。
    • s= "abcdefgh"
      sa = np.fromstring(s,dtype = np.int8)
      print (sa)
      #--------------------------------------
      [ 97  98  99 100 101 102 103 104]
    • fromfuction函數:傳入一個函數來建立數組
    • def fun(i,j):
          return (i+1)*(j+1)
      fa = np.fromfunction(fun,(9,9)) #(9,9)表示數組的shape,傳給fun的書是每一個元素的定位,有81個位置,能夠獲得81個元素
      print (fa)
      #---------------------------------------------------
      [[  1.   2.   3.   4.   5.   6.   7.   8.   9.]
       [  2.   4.   6.   8.  10.  12.  14.  16.  18.]
       [  3.   6.   9.  12.  15.  18.  21.  24.  27.]
       [  4.   8.  12.  16.  20.  24.  28.  32.  36.]
       [  5.  10.  15.  20.  25.  30.  35.  40.  45.]
       [  6.  12.  18.  24.  30.  36.  42.  48.  54.]
       [  7.  14.  21.  28.  35.  42.  49.  56.  63.]
       [  8.  16.  24.  32.  40.  48.  56.  64.  72.]
       [  9.  18.  27.  36.  45.  54.  63.  72.  81.]]
  • 序列傳入:
    • import numpy as np
      a = np.array([1,2,3,4,5])
      b = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
      print (a)
      print (b)
      #-------------------------------------------
      [1 2 3 4 5]
      [[ 1  2  3  4]
       [ 4  5  6  7]
       [ 7  8  9 10]]

二、數組的屬性:

    • ndim屬性:數組的維數
    • >>> np.ones((3,2))
      array([[ 1.,  1.], [ 1., 1.], [ 1., 1.]]) >>> np.ones((3,2)).ndim 2 #二維
    • size:數組元素的總個數,等於shape屬性中元組元素的乘積。
    • >>> np.ones((3,2)).size
      6 #6個元素
    • dtype屬性:查看或指定數組類型
    • print(a.dtype) # 數組的元素類型 int32,32bit整型數據
      print(b.dtype) # 數組的元素類型 int32
      aa = np.array([2,3,4,5,6],dtype = np.float) print (aa) #---------------------------------------------- [ 2. 3. 4. 5. 6.]
    • shape屬性:查看或改變數組的大小
    • print(a.shape) #數組的大小 (5)
      print(b.shape) #數組的大小 shape (3,4) #修改shape來修改數組軸的大小: b.shape = (4,3) print (b) #-------------------------------------- [[ 1 2 3] [ 4 4 5] [ 6 7 7] [ 8 9 10]] #若是某個軸的值爲-1,則會根據數組的總數計算此軸的長度。如b一共12個元素,修改shape b.shape = (2,-1) #那麼就會獲得一個2*6的數組 print (b) #-------------------------------------- [[ 1 2 3 4 4 5] [ 6 7 7 8 9 10]] b.shape = (6,-1) #那麼就會獲得一個6*2的數組 print (b) #-------------------------------------- [[ 1 2] [ 3 4] [ 4 5] [ 6 7] [ 7 8] [ 9 10]]
    • reshape屬性:修改一個數組的尺寸獲得一個新數組,原數組不變,可是這兩個數組共享內存,若是修改值的話這兩個數組都會變。
    • c = a.reshape((5,1)) #此方法實驗證實:只能是x*y=數組的總元素才能夠,這裏1*5只能換成5*1
      print (c) #此時a的結構並沒改變,a,c共享內存。
      print (a)
      #--------------------------------------
      [[1]
       [2]
       [3]
       [4]
       [5]]
      [1 2 3 4 5]
      #修改a[1][2]的值
      a[2] = 100
      print (c) #此時a的結構並沒改變,a,c共享內存。
      print (a)
      #--------------------------------------
      [1 2 3 4 5]
      [[  1]
       [  2]
       [100]
       [  4]
       [  5]]
      [  1   2 100   4   5]

三、數組存取:

  • 切片法[[[----***逗號「,」分行,列。冒號「:」分範圍***---]]]
  • >>> import numpy as np
    >>> np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]]) array([[ 1, 2, 3, 4], [ 4, 5, 6, 7], [ 7, 8, 9, 10]]) >>> b = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]]) >>> b[0] array([1, 2, 3, 4]) >>> b[1] array([4, 5, 6, 7]) >>> b[1,2] 6 >>> b[1,3] 7 >>> b[1,-1] 7 >>> b[-1] array([ 7, 8, 9, 10]) >>> b[-1,2] 9 >>> b[-1,-2] 9
    >>> b[:-2] #0--負2列 array([[1, 2, 3, 4]]) >>> b[1:2] array([[4, 5, 6, 7]]) >>> b[1:3] array([[ 4, 5, 6, 7], [ 7, 8, 9, 10]])
    #*************矩陣的截取***********************

      >>> a=np.mat(np.random.randint(2,15,size=(3,3)))
      >>> a
      matrix([[ 4, 10, 14],
              [11, 3, 12],
              [ 4, 2, 12]])
      >>> a[1:,1:,]
      matrix([[ 3, 12],
              [ 2, 12]])code

3、矩陣對象matrix:

numpy庫提供了matrix類,使用matrix類建立的是矩陣對象,它們的加減乘除運算缺省採用矩陣方式計算。可是因爲NumPy中同時存在ndarray和matrix對象,所以很容易將二者弄混。htm

  • 建立矩陣:matrix函數(也能夠用簡寫mat) a = np.matrix([[1,2,3],[5,5,6],[7,9,9]]) 
  • #利用ones()建立一個2*4的全1矩陣
    >>> np.mat(np.ones((2,4))) 
    matrix([[ 1.,  1.,  1.,  1.], [ 1., 1., 1., 1.]])
  • #用numpy的隨機數rand產生一個2*2的隨機數組並轉化成矩陣
    >>> np.mat(np.random.rand(2,2)) 
    matrix([[ 0.4340437 ,  0.98055453],
            [ 0.52937992,  0.81452857]])
    #產生一個2-8之間的整數數組大小是2*5,再轉換成矩陣。
    >>> np.mat(np.random.randint(2,8,size=(2,5)))
    matrix([[3, 6, 4, 4, 5],
            [3, 7, 7, 2, 3]])
    #eye()函數產生單位對角數組,轉換成單位對角陣
    >>> np.mat(np.eye(2,2,dtype=int))
    matrix([[1, 0], [0, 1]]) >>> np.mat(np.eye(3,2,dtype=int)) matrix([[1, 0], [0, 1], [0, 0]]) >>> np.mat(np.eye(3,3,dtype=int)) matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
    #將一維數組轉換成對角陣
    >>> np.mat(np.diag([1,2,3]))
    matrix([[1, 0, 0], [0, 2, 0], [0, 0, 3]]) >>>
  • 矩陣運算:乘積,求逆,冪運算,轉置
    >>> import numpy as np
    >>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]]) >>> a matrix([[1, 2, 3], [5, 5, 6], [7, 9, 9]]) >>> a**-1 #求逆 a.I也是a的逆 matrix([[-0.6 , 0.6 , -0.2 ], [-0.2 , -0.8 , 0.6 ], [ 0.66666667, 0.33333333, -0.33333333]]) >>> a*a**-1 #a乘a的逆,矩陣內積 matrix([[ 1.00000000e+00, 1.66533454e-16, -1.11022302e-16], [ 0.00000000e+00, 1.00000000e+00, -4.44089210e-16], [ 4.44089210e-16, 5.55111512e-17, 1.00000000e+00]])
    >>> a.T #a的轉置 matrix([[1, 5, 7], [2, 5, 9], [3, 6, 9]]) >>>
  • 矩陣函數:
    • dot():作矩陣乘法,一維數組作點積,二維數組作內積,不過乘積必須知足矩陣相乘的形式(M(x,y)*M2(y,z)),兩個矩陣的行列必須對應,都是一維的話必須是一個行向量,一個列向量,能夠用m.reshape(-1,1)將行向量轉爲列向量,或者m.reshape(1,-1)將列向量轉爲行向量。
    • inner():
    • outer():
  • 矩陣中更高級的一些運算能夠在NumPy的線性代數子庫linalg中找到。例如inv函數計算逆矩陣,solve函數能夠求解多元一次方程組。
  • >>> from numpy import linalg as ll
    >>> ll.inv(a) #求逆
    matrix([[-0.6       ,  0.6       , -0.2 ], [-0.2 , -0.8 , 0.6 ], [ 0.66666667, 0.33333333, -0.33333333]]) >>> a matrix([[1, 2, 3], [5, 5, 6], [7, 9, 9]])
 參考:http://blog.csdn.net/sunny2038/article/details/9002531
 參考:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html#id8
相關文章
相關標籤/搜索