1. 程式人生 > >機器學習之python入門指南(十一)numpy常用方法簡介

機器學習之python入門指南(十一)numpy常用方法簡介

 

numpy庫的安裝:

window下命令列直接輸入pip install numpy

匯入numpy庫:import numpy 或者 import numpy as np

numpy與list:

相同之處:

都可以用下標訪問元素,如a[3].

都可以切片訪問,如a[1:3]

都可以使用for迴圈進行遍歷

不同之處

numpy之中的每個元素型別必須相同,而list可以混合多個型別元素

numpy使用更方便,封裝了許多函式,例如:mean,std,sum,min等

numpy可以是多維陣列。numpy用c實現,操作起來速度更快

numpy資料型別:

 

1 ndarray物件

  numPy 中定義的最重要的物件是稱為 ndarray 的 N 維陣列型別。它描述相同型別的元素集合。 可以使用基於零的索引訪問集合中的專案。ndarray類的例項可以通過本教程後面描述的不同的陣列建立例程來構造。基本的ndarray是使用 numPy 中的陣列函式建立的 

  我們可以通過給array函式傳遞Python的序列物件建立陣列,如果傳遞的是多層巢狀的序列,將建立的多維陣列。numpy.array(object,dtype = None, copy = True, order = None, subok = False, ndmin = 0)

引數描述:

 

例子如下:

 

1.1陣列屬性

numpy.shape陣列的大小可以通過屬性shape獲得。在保持陣列元素個數不變的情況下可以改變陣列每個軸的長度。

當某個軸的元素為-1時,將根據陣列元素的個數自動計算此軸的長度。使用陣列的reshape方法,可以建立一個改變了尺寸的新陣列,原陣列的shape將保持不變。(注意:這兩個陣列其實共享儲存區域,因此修改任意一個數組元素的內容都會修改另外一個數組的內容)。

numpy.dtype 陣列元素型別可以通過dtype屬獲得,可以通過dtype引數在建立的時候指定元素型別。  

numpy.itemsize返回陣列中每個元素的位元組單位長度:

 

執行結果為:4

陣列建立

numpy.empty建立指定形狀和dtype未初始化的陣列,使用以下建構函式:numpy.empty(shape,dtype = float, order = 'C') :引數列表如下:

例子如下:

注意:陣列元素為隨機值,因為他們未初始化。numpy.zeros返回特定大小,以0填充的新陣列:numpy.zeros(shape,dtype = float, order = 'C')例子如下:

numpy.ones返回特定大小,以1填充的新陣列:

 

3用已有資料建立陣列

numpy.asarray類似於numpy.array。基本用法和array類似。與array的區別如下:

由圖可見:對於元資料:二者沒有區別,都是對元資料複製並轉換為ndarray。

由圖可見:當資料來源是ndarry時,array會copy出一個副本,佔用新的記憶體,但是asarry不會。

numpy.frombuffer

此函式將緩衝區解釋為一維陣列。暴露緩衝區介面的任何物件都用作引數來返回ndarray

numpy.frombuffer(buffer,dtype = float, count = -1, offset = 0)

 

numpy.fromiter

此函式從任何可迭代物件構建一個ndarray物件,返回一個新的一維陣列。

 

4來自數值範圍的陣列

numpy.arangenumpy.arange(start,stop, step, dtype)類似於python中的range函式,通過起始值,終值和步長來建立一維陣列(陣列不包括終值)

numpy.linspace

同過指定初始值,終值,和元素個數來建立一維陣列,通過endpoint關鍵字指定是否包含終值,預設設定是包含終值。numpy.linspace(start,stop, num, endpoint, retstep, dtype)

numpy.logspace

此函式返回一個ndarray物件,其中包含在對數刻度上均勻分佈的數字,刻度的開始和結束端點都是某個底數的冪。通常為10num.logspace(start,stop,num,endpoint,base,dtype)

 

 

 

5切片和索引

ndarray物件中的元素遵循基於零的索引。 有三種可用的索引方法型別: 欄位訪問,基本切片和高階索引 

欄位訪問:

和python列表序列不同,通過下標範圍獲取的新的陣列是原始陣列的一個檢視,他與原始陣列共享一塊資料空間。如:

 

切片索引:

切片索引通過將start、stop、和step引數提供給內建的slice函式來構建一個Python slice物件,此slice物件被傳遞給陣列提取來提取陣列的一部分。

 

除了用下標索引和切片索引外,numpy還提供了兩中高階索引方法

使用整數序列索引

當使用整數序列對陣列元素進行存取時,將使用序列中的每個元素作為下標,整數序列可以是列表或者陣列,使用整數序列作為下標活得的陣列不和原始陣列共享資料空間。

 

使用布林陣列

當使用布林陣列b作為下表存取陣列x中的元素時,將收集陣列x中所有在陣列b中對應下標為True的元素。使用布林陣列作為下標獲得的陣列不和原始陣列共享資料空間,這種方式對應於布林陣列,不對應於列表。

 

下圖輸出大於5的數字

 

 

廣播

廣播是指在numpy在算術運算期間處理不同形狀的陣列的能力,對陣列的運算通常是在元素上進行,如果兩個陣列具有完全相同的形狀,則這些操作將被無縫執行。

  如果兩個陣列的維數不相同,則元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以對形狀不相似的陣列進行操作,因為它擁有廣播功能。較小的陣列會廣播到較大陣列的大小,以便使它們的形狀可相容

  ndim較小的陣列會在前面追加一個長度為 1 的維度。

  輸出陣列的每個維度的大小是輸入陣列該維度大小的最大值。

  如果輸入在每個維度中的大小與輸出大小匹配,或其值正好為 1

  如果輸入的某個維度大小為1,則該維度中的第一個資料元素將用於該維度的所有計算。 

 

6陣列上的迭代

numpy包含一個迭代器物件numpy.nditer,它是一個有效的多維迭代器物件,可以用於在陣列上的迭代,陣列的每個元素可以使用Python的標準介面訪問

 

迭代的順序匹配陣列的內容佈局,而不是考慮特定的排序。

廣播迭代 如果兩個陣列是可廣播的,nditer組合能夠同時迭代他們。例項如下:  翻轉操作  numpy.transpose 格式如下: numpy.transpose(arr, axes) arr:表示要轉置的矩陣,axes:整數的列表,對應維度,通常所有的維度都會翻轉   numpy.adarry.T(效果與transpose類似) numpy.rollaxis   該函式向後滾動特定的軸,直到一個特定的位置,這個函式接受3個引數。numpy.rollaxis(arr, axis, start) arr:輸入陣列 axis:要向後滾動的軸,其他軸的相對位置不變 start:預設為0,表示完整的滾動,會滾到特定的位置  7陣列連線  numpy concatenate此函式用於指定軸連線相同形狀的兩個或多個數組 numpy.concatenate((a1, a2, ...),axis) a1,a2…相同型別的陣列   numpy.stack此函式沿新軸連線陣列numpy.stack(arrays, axis)

arrays:相同形狀的陣列序列

axis:返回陣列中的軸,輸入陣列沿著它來堆疊

axis:沿著它連線的陣列的軸,預設為0  算數函式三角函式 numpy擁有標準的三角函式,它為弧度制單位的給定角度返回三角函式比例 

arcsin 和 arccos和arctan函式返回給定角度的sin,cos和tan的反三角函式,這些結果可以通過numpy.degree()函式來將弧度制轉換為角度制。(以下以arcsin為例)

8統計函式

numpy.amin 和numpy.amax

這些函式表示從給定陣列中的元素,沿指定軸返回最小值和最大值