一、概述

Numpy是Python中的一個科學計算庫,提供了矩陣運算的功能,由於numpy提供了更多方便了函數,在實際的使用中numpy要優於python中的list。本文將會著重於機器學習過程中對numpy的使用需要了解的大致操作,來介紹numpy的初步使用指南。

二、安裝和導入

普通的pip操作即可完成安裝(若同時安裝了python2和python3想在python3中安裝請使用pip3):

pip install numpy

導入numpy:

import numpy as np

三、數據結構

numpy的主要對象是同種元素的多維數組。這是一個所有的元素都是一種類型、通過一個正整數元組索引的元素表格(通常是數字表格)。在numpy中維度叫做軸(axes),軸的個數叫做秩(rank)。 打個比方,在三維空間中一個點的坐標*[1,2,3]*就是一個秩為1的數組,因為它軸的個數為1,該軸的長度為3。numpy的數組類叫做ndarry,通常被稱作數組,它與標準Python庫類array.array並不相同,後者只處理一維數組和提供少量功能。

ndarry的主要對象屬性有:

  • ndarray.ndim:軼的值

  • ndarray.shape:數組的維度。這是一個指示數組在每個維度上大小的整數元組。例如一個n排m列的矩陣,他的shape屬性就是(2,3),這個元組的長度是軼,即維度或是ndim屬性

  • ndarray.size:數組元素的總個數,等於shape屬性中元組元素的乘積

  • ndarray.dtype:一個用來描述數組中元素類型的對象,可以通過創造或指定dtype使用標準的Python類型,也可以使用numpy自己提供的數據類型

  • ndarray.itemsize:數組中每個元素的字節大小。例如,一個元素類型為float64的數組itemsiz屬性值為*(64/8=)*8

  • ndarray.data:包含實際數組元素的緩衝區,通常不使用這個屬性

四、使用numpy

4.1 創建數組

  1. 使用array函數從常規的Python列表和元組創造數組。所創建的數組類型由原序列中的元素類型推導而來。

    >>> a = array([2,3,4])  #RIGHT
    >>> a = array(2,3,4)    #WRONG
    
    1. 數組將序列包含序列轉化為二維的數組,序列包含序列包含序列轉化成三維數組。 python >>> b = array([(1,2,3,4),(1,2,3,4)])
  2. 數組類型可以在創建的時候指定

    >>> c = array([[1,2],[3,4]],dtype=complex)
    
    1. 一般來說,數組的元素開始都是未知的,但是它的大小是已知的。numpy提供了一些使用佔位符創建數組的函數。函數zeros創建一個全是0的數組,函數ones創建一個全1的數組,函數empty創建一個內容隨機並且依賴於內存狀態的數組。默認創建的數組類型(dtype)都是float64.

    2. 為了創建一個數列,numpy提供了一個類似arrange的函數返回數組而不是列表:

      >>> arange(10,30,5)
      array([10,15,20,25])
      

4.2 打印數組 當你打印一個數組,numpy以類似嵌套列表的形式顯示它,但是呈以下布局:

  • 最後的軸從左到右打印

  • 次後的軸從頂向下打印

  • 剩下的軸從頂向下打印,每個切片通過一個空行與下一個隔開

>>>a = array(6)
>>>print(a)
[0 1 2 3 4 5]
>>>b = arange(12).reshape(4,3)
>>>print(b)
[[ 0 1 2 ]
  [ 3 4 5 ]
  [ 6 7 8 ]
  [9 10 11]]
>>> c = arange(24).reshape(2,3,4)      
>>> print c
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

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

如果一個數組用來打印太大了,numpy自動省略中間部分只打印角落

如果想要禁用這種行為並強制打印整個數組,可以設置printoptions參數來更改打印選項

>>> set_printoptions(threshold='nan')

4.3 基本運算 1. 數組的算是運算時按元素的。新的數組被創建而且結果被填充 2. numpy中乘法運算符*指示按元素運算,矩陣乘法可以用dot函數或創建舉證對象實現 3. 有些操作符像+=和*=被用來更改已存在數組而不是創建一個新的數組 4. 通用函數,numpy中提供常用的數學函數如*sin*,*cos*,*tan*,這些叫做通用函數,常用的通用函數之後會開個單篇介紹。

4.4 索引、切片和迭代 一維數組可以被索引、切片和迭代,就像列表和其他python序列。 多維數組可以每個軸有一個所有。這些索引由一個逗號分隔的元組給出。

>>> def f(x,y):
...         return 10*x+y
...
>>> b = fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[0:5, 1]                       # each row in the second column of b
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1]                        # equivalent to the previous example
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ]                      # each column in the second and third row of b
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])

當少於軸數的索引被提供時,缺失的索引默認為整個切片。

4.5 形狀操作 一個數組的形狀由它每個軸上的元素的個數給出。 一個數組的形狀可以被多種命令修改:

>>> a = floor(10*random.random((3,4)))
>>> a
array([[ 7.,  5.,  9.,  3.],
       [ 7.,  2.,  7.,  8.],
       [ 6.,  8.,  3.,  2.]])
>>> a.shape
(3, 4)
>>> a.ravel() # flatten the array
array([ 7.,  5.,  9.,  3.,  7.,  2.,  7.,  8.,  6.,  8.,  3.,  2.])
>>> a.shape = (6, 2)
>>> a.transpose()
array([[ 7.,  9.,  7.,  7.,  6.,  3.],
       [ 5.,  3.,  2.,  8.,  8.,  2.]])
>>> a
array([[ 7.,  5.],
       [ 9.,  3.],
       [ 7.,  2.],
       [ 7.,  8.],
       [ 6.,  8.],
       [ 3.,  2.]])
>>> a.resize((2,6))
>>> a
array([[ 7.,  5.,  9.,  3.,  7.,  2.],
       [ 7.,  8.,  6.,  8.,  3.,  2.]])

reshape函數改變的改變shape參數形狀返回它,而resize函數是改變數組自身

4.6 組合不同的數組 vstackhstack可以沿不用軸將數組堆疊在一起。 column_stack以列的形式將一維數組合成二維數組,它等同於vstack函數對一維數組。 row_stack則是以行將一維數組合成二維數組。 hsplit能將數組沿水平軸分割成幾個數組,可以指定返回相同形狀的數組的個數,也可以指定那些列發生分割,同理vsplit沿縱軸分割,array split允許指定沿哪個軸分割。

五、總結

做個常用的numpy操作函數總結:

創建數組 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

numpy在機器學習中的應用主要還是在算法階段,在數據處理階段pandas庫使用得更多。熟悉numpy庫有助於我們更好得自己實現各種機器學習的算法。


參考博客:NumPy的詳細教程