?NumPy(Numerical Python) 是 Python 語言的一個(gè)擴(kuò)展程序庫(kù),支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協(xié)作者共同開發(fā),2005 年,Travis Oliphant 在 Numeric 中結(jié)合了另一個(gè)同性質(zhì)的程序庫(kù) Numarray 的特色,并加入了其它擴(kuò)展而開發(fā)了 NumPy。NumPy 為開放源代碼并且由許多協(xié)作者共同維護(hù)開發(fā)。
NumPy 是一個(gè)運(yùn)行速度非??斓臄?shù)學(xué)庫(kù),主要用于數(shù)組計(jì)算,包含:
一個(gè)強(qiáng)大的N維數(shù)組對(duì)象 ndarray
廣播功能函數(shù)
整合 C/C++/Fortran 代碼的工具
線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能
在機(jī)器學(xué)習(xí)中常用的語法如下:
1、ndarray的創(chuàng)建?
數(shù)組轉(zhuǎn)換:將Python下的list轉(zhuǎn)換為ndarray
import numpy as npdata=?[6,7.5,8,0,1]array=?np.array(data)輸出:array([ 6. ,? 7.5,? 8. ,? 0. ,? 1. ])
二維數(shù)組?
data?=?[[1,2,3,4],[5,6,7,8]]array?=?np.array(data)array輸出為:array([[1, 2, 3, 4],? ? ? [5, 6, 7, 8]])
等差數(shù)組?
np.arange(1,15,2)輸出為:array([1,3,5,7,9,11,13])
隨機(jī)整數(shù)數(shù)組?
data = np.random.randint(0,10,size=(3,4))data輸出為:array([[2,2,4,5],[7, 5, 8, 5],[9, 0, 6, 1]])
2、ndarray的數(shù)據(jù)類型?
指定array的數(shù)據(jù)類型data1?=?np.array([1,2,3],dtype=np.int32)data2?=?np.array([1,2,3],dtype=np.float32)#查看array的數(shù)據(jù)類型arr2.dtype### dtype('float32')
3、數(shù)組運(yùn)算
data?=?np.array([[1,2,3],[4,5,6]],dtype=np.float32)data?*?data輸出:array([[??1.,???4.,???9.],???????[?16.,??25.,??36.]],?dtype=float32)
4、索引和切片
numpy基本的索引和切片功能和Python列表的操作相似,不過要注意的是numpy中數(shù)組切片是原始數(shù)組的視圖,這意味著數(shù)據(jù)不會(huì)被復(fù)制,視圖上任何數(shù)據(jù)的修改都會(huì)反映到原數(shù)組上,因?yàn)閚umpy被設(shè)計(jì)用來處理大數(shù)據(jù),如果切片不是視圖而是復(fù)制產(chǎn)生新數(shù)據(jù)的話,會(huì)產(chǎn)生相應(yīng)的性能和內(nèi)存問題。如下面的例子,對(duì)切片的操作會(huì)影響原數(shù)組:?
arr = np.arange(10)arr[5]# 5arr[5:8]#array([5, 6, 7])arr[5:8]=12t = arr[5:8]t[1] = 12345arr#array([? ? 0,? ? 1,? ? 2,? ? 3,? ? 4,? ? 12, 12345,? ? 12,? ? 8,? ? 9])
6、數(shù)組轉(zhuǎn)置和軸對(duì)換
數(shù)組的轉(zhuǎn)置是重塑的一種特殊形式,它返回的事原數(shù)據(jù)的視圖。不僅有transpose方法,還有特殊的T屬性:
arr = np.arange(15).reshape((5,3))
arr.T
#array([[ 0,? 3,? 6,? 9, 12],
[ 1,? 4,? 7, 10, 13],
[ 2,? 5,? 8, 11, 14]])
對(duì)于高維數(shù)組,tranpose需要得到一個(gè)由軸編號(hào)組成的元組才能對(duì)這些軸進(jìn)行轉(zhuǎn)置,太費(fèi)腦子:
arr = np.arange(16).reshape((2,2,4))
arr
#array([[[ 0,? 1,? 2,? 3],
[ 4,? 5,? 6,? 7]],
[[ 8,? 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose((1,0,2))
#array([[[ 0,? 1,? 2,? 3],
[ 8,? 9, 10, 11]],
[[ 4,? 5,? 6,? 7],
[12, 13, 14, 15]]])
還可以使用swapaxes函數(shù)進(jìn)行轉(zhuǎn)置,它接受一對(duì)軸編號(hào):
arr.swapaxes(1,2)
7、數(shù)組函數(shù)
通用函數(shù):元素級(jí)數(shù)組函數(shù)
通用函數(shù)中,有一元的函數(shù),如abs,sqrt,square,exp,log等等,也有二元的函數(shù)maximum、minimum等等,這些都比較簡(jiǎn)單,我們舉兩個(gè)例子即可:
arr = np.arange(10)
np.sqrt(arr)
x = np.random.randn(8)
y = np.random.randn(8)
np.maximum(x,y)
#array([ 0.68417031,? 0.22971426,? 1.69724546,? 1.19366822, -0.79176777, -0.43557768,? 0.66628223,? 0.85093113])
where函數(shù)
where函數(shù),三個(gè)參數(shù),條件,條件為真時(shí)選擇值的數(shù)組,條件為假時(shí)選擇值的數(shù)組:
xarr = np.array([1.1,1.2,1.3,1.4,1.5])
yarr = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])
np.where(cond,xarr,yarr)
輸出為:
array([ 1.1,? 2.2,? 1.3,? 1.4,? 2.5])
也可以使用下面的形式,后兩個(gè)參數(shù)為指定值:
np.where(xarr>1.2,2,-2)
#array([-2, -2,? 2,? 2,? 2])
數(shù)學(xué)和統(tǒng)計(jì)方法
數(shù)學(xué)和統(tǒng)計(jì)方法既可以當(dāng)作數(shù)組的實(shí)例方法調(diào)用,也可以當(dāng)作頂級(jí)numpy函數(shù)調(diào)用,比如下面兩種計(jì)算數(shù)組均值的方法是等效的:
arr = np.random.randn(5,4)
arr.mean()
np.mean(arr)
mean或sum這一類函數(shù)可以接受一個(gè)axis參數(shù),用于計(jì)算該軸向上的統(tǒng)計(jì)值,最終結(jié)果是一個(gè)少一維的數(shù)組。對(duì)于一個(gè)二維數(shù)組,axis=0相當(dāng)于按列操作,最終元素的個(gè)數(shù)和第二維的大小相同,axis=1相當(dāng)于按行操作,最終元素的個(gè)數(shù)和第一維的大小相同:
arr.mean(axis=1)
#array([ 0.29250253, -0.50119163,? 0.11746254,? 0.23338843,? 0.15912472])
arr.sum(0)
#array([ 1.92728592,? 0.67480797, -2.8398905 ,? 1.44294295])
也可以用cumsum(累加值計(jì)算)和cumprod(累積值計(jì)算)保留中間計(jì)算結(jié)果:
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr.cumsum(0)
#array([[ 1,? 2,? 3],
[ 5,? 7,? 9],
[12, 15, 18]])
arr.cumprod(1)
#array([[? 1,? 2,? 6],
[? 4,? 20, 120],
[? 7,? 56, 504]])
排序方法
np中還提供了排序方法,排序方法是就地排序,即直接改變?cè)瓟?shù)組:
arr = np.random.randn(8)
arr
#array([-0.85668922, -2.0049649 , -0.89885165, -0.04185277,? 0.73736138,-0.03509021, -1.89745107, -2.36576122])
arr.sort()
arr
#array([-2.36576122, -2.0049649 , -1.89745107, -0.89885165, -0.85668922,-0.04185277, -0.03509021,? 0.73736138])
集合運(yùn)算函數(shù)
unique計(jì)算x中的唯一元素,并返回有序結(jié)果
arr = np.array([1,3,2,5,2,4,2,2,1,4,5,2])
np.unique(arr)
#array([1, 2, 3, 4, 5])
numpy提供了下面三個(gè)常見的集合運(yùn)算函數(shù):
intersect1d(x,y) 用于計(jì)算x和y的公共結(jié)果,并返回有序結(jié)果
union1d(x,y) 用于計(jì)算x和y的并集,并返回有序結(jié)果
setdiff1d(x,y),集合的差,即元素在x中不在y中
x = np.array([1,2,4,5])
y = np.array([3,4,5])
np.intersect1d(x,y)
#array([4, 5])
np.union1d(x,y)
#array([1, 2, 3, 4, 5])
np.setdiff1d(x,y)
#array([1, 2])
8、線性代數(shù)
numpy還提供了許多線性代數(shù)運(yùn)算的函數(shù),比如計(jì)算矩陣的乘積:
#矩陣的乘積
x = np.array([[1,2,3],[4,5,6]])
y = np.array([[6,23],[-1,7],[8,9]])
np.dot(x,y)
下面可以計(jì)算矩陣的逆、行列式、特征值和特征向量、qr分解值,svd分解值:
#計(jì)算矩陣的逆
from numpy.linalg import inv,det,eig,qr,svd
t = np.array([[1,2,3],[2,3,4],[4,5,6]])
inv(t)
#計(jì)算矩陣行列式
det(t)
#計(jì)算QR分解址
qr(t)
#計(jì)算奇異值分解值svd
svd(t)
#計(jì)算特征值和特征向量
eig(t)