Numpy(numeric python),是 python 的一個開源數值計算庫,主要用于
數組和矩陣計算。底層是 c 語言實作,運作效率遠高于純 python 代碼。在
python 資料科學領域,numpy 是使用最廣泛的工具包之一。
Numpy 提供了兩種基本的對象:ndarray(N-dimensional Array Object) 和 ufunc
(Universal Function Object)
• ndarray 是存儲單一資料類型的多元數組,包含 array 及其子類 matrix
• ufunc 則是能夠對數組的每一個元素進行處理的函數
安裝:pip install numpy
建立數組對象
Numpy 提供的 array 函數可以建立一維或多元數組,基本使用文法如下:
np.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
相關屬性
我們也可以通過内置函數來建立數組:
一維
np.arange(start,end,step)
等差數列,固定步長
np.linspace(start,end,num=50)
等差數列,固定個數
np.logspace(start,end,num=50,base=10) 等比數列
np.diag(array,k=0)
抽取對角線
多元
np.zeros(shape)
#用零填
np.zeros_like(a)
#複制a的shape,用零填
np.ones(shape)
#用1填
np.ones_like(a)
#複制a的shape,用1填
np.full(shape, fill_value) #用指定值填
np.identity(n)
#n行的機關矩陣(對角線為1)
np.eye(N, M=None, k=0) #類似上面,但可以指定列,k值對對角線平移
我們還可以使用 random 子產品建立數組:
np.random.random()
:無限制條件下生成随機數組
np.random.rand()
:生成服從均勻分布的随機數組
np.random.randn()
:生成服從正态分布的随機數組
np.random.randint(low, high=None, size=None)
:生成指定區間的随機數組
random 子產品其他常用函數:
數組資料類型
在 numpy 中,所有數組的資料類型是同質的,即數組中的所有元素類型必須是一
緻的。這樣做的好處是,更容易确定該數組所需要的存儲空間。下面是 numpy 的
基本資料類型及其取值範圍
我們知道 python 中 空值記為 None,而在 numpy 中的空值表示為: np.nan ,它是一個特殊的float。
我們也可以自定義資料類型:
建立一個存儲餐飲企業庫存資訊的資料類型。其中,用一個長度為40個字元的字元串來記錄商
品的名稱,用一個64位的整數來記錄商品的庫存數量,最後用一個64位的單精度浮點數來記
錄商品的價格,具體步驟如下。
數組的通路
• 通過索引通路
通路數組的方式 a[m][n]
通路矩陣的方式 a[m,n]
通過整數數組
a[[1,3,4]]
通過布爾數組
a[[True,Flase,True]]
• 通過切片通路
一維數組切片同 python 序列切片一緻,a[start:stop:step]
多元數組切片,每個次元以逗号隔開,a[start:stop:step, start:stop:step]
或者 a[:][:]
數組變形
• reshape
a.reshape(),傳回一個新的數組,原數組 a 不受影響
• resize
a.resize(),傳回 None,修改的是原數組 a
數組扁平化
• ravel
a. ravel(),将多元壓縮為一維,傳回原數組的引用,對新結果修改,a會受影響
• flatten
a. flatten(),将多元壓縮為一維,傳回原數組的拷貝,對新結果修改,a不會受影響
二者均可以指定 order 的值為“
F”從列的方向上壓扁
數組組合
• hstack
np.hstack((arr1,arr2))
數組橫向組合
np.c_[arr1,arr2]
• vstack
np.vstack((arr1,arr2))
數組縱向組合
np.r_[arr1,arr2]
• concatenate
np. concatenate((arr1,arr2),axis=1)
數組橫向組合
np. concatenate((arr1,arr2),axis=0)
數組縱向組合
數組分割
• hsplit
np.hsplit(arr,2)
數組橫向分割
• vsplit
np.vsplit(arr,2)
數組橫向分割
• split
np. split(arr,2,axis=0)
數組縱向分割
np. split(arr,2,axis=1)
數組橫向分割
建立 numpy 矩陣
在NumPy中,矩陣是ndarray的子類,是繼承自NumPy數組對象的二維數組對象。與數
學概念中的矩陣一樣,NumPy中的矩陣也是二維的。
使用mat函數建立矩陣: matr1 = np.mat("1 2 3;4 5 6;7 8 9")
使用matrix函數建立矩陣:matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
差別:使用mat函數建立矩陣時,若輸入matrix或ndarray對象,則不會為它們建立副本
很多時候會根據小的矩陣建立大的矩陣:
使用bmat函數合成矩陣:np.bmat("arr1 arr2; arr1 arr2"
矩陣的運算
在NumPy中,矩陣計算是針對整個矩陣中的每個元素進行的:
矩陣與數相乘:matr1*3
矩陣相加減:matr1±matr2
矩陣相乘:matr1*matr2
矩陣對應元素相乘:np.multiply(matr1,matr2)
矩陣特有屬性:
矩陣的運算(此處以矩陣乘法和轉置為例)
• numpy.linalg 中有一組标準的矩陣分解運算以及諸如求逆和行列式之類的
函數(了解)
通用函數
• ufunc(universal function),全稱通用函數,是一種能夠對數組中所有
元素進行操作的函數
四則運算:加(+)、減(-)、乘(*)、除(/)、幂(**)。數組間的四則運算表示
對每個數組中的元素分别進行四則運算,是以形狀必須相同。
比較運算:>、<、==、>=、<=、!=。比較運算傳回的結果是一個布爾數組,每個
元素為每個數組對應元素的比較結果。
邏輯運算:np.any函數表示邏輯“or”,np.all函數表示邏輯“and”。運算結果傳回
布爾值。
• 四則運算
• 标量運算,會作用到整個數組上
• 比較運算
廣播機制
廣播(Broadcasting)是指不同形狀的數組之間執行算術運算的方式。當使
用ufunc函數進行數組計算時,ufunc函數會對兩個數組的對應元素進行計算。
進行這種計算的前提是兩個數組的shape一緻。若兩個數組的shape不一緻,
則NumPy會實行廣播機制。
廣播的條件:待擴充的軸的長度為 1 時
次元擴張和維數擴張:向最大值靠攏
讀寫檔案
讀寫二進制資料
save 函數是以二進制的格式儲存資料。
np.save("../tmp/save_arr",arr)
savez 函數可以将多個數組儲存到一個檔案中。
np.savez('../tmp/savez_arr',arr1,arr2)
load 函數是從二進制的檔案中讀取資料。
np.load("../tmp/save_arr.npy")
注意:存儲時可以省略擴充名,但讀取時不能省略擴充名。
讀寫文本檔案
savetxt 函數是将數組寫到某種分隔符隔開的文本檔案中。
np.savetxt("../tmp/arr.txt", arr, fmt="%d", delimiter=",")
loadtxt 函數執行的是把檔案加載到一個二維數組中。
np.loadtxt("../tmp/arr.txt",delimiter=",")
genfromtxt 函數面向的是結構化數組和缺失資料。
np.genfromtxt("../tmp/arr.txt", delimiter = ",")
排序
• 直接排序
np.sort(arr, axis=-1, kind=None, order=None)
axis 可指定排序的方向,0 縱向,1 橫向
kind 可指定排序的算法,預設快排
也可使用 arr.sort() 來排序
• 間接排序
np.argsort(arr, axis=-1, kind=None, order=None) 或 arr.argsort()
傳回值為重新排序值的下标
np.lexsort(keys, axis=-1) ,用法: np.lexsort((a,b,c))
按最後傳入的數組排序
去重與重複
• 去重
• np.unique(arr)
• 重複
np.tile(arr,arr)
arr.repeat(3,axis=1)
tile 和 repeat 差別:tile 是對數組進行重複操作,repeat 是對數組中的每個元素進行
重複操作前者是函數,後者是方法。
常用統計函數
當 axis=0 時,表示沿着縱軸計算。當 axis=1時,表示沿着橫軸計算。預設計算一個總值。
常用統計函數
• 案例:随機漫步
在學習完以上内容後還要多加練習!