Numpy的組成與功能
Numpy(Numeric Python)可以被理解為一個(gè)用python實(shí)現(xiàn)的科學(xué)計(jì)算包,包括:
????????? 1.強(qiáng)大的N維數(shù)組對象Array镀钓;
?????????? 2.成熟的函數(shù)庫摇幻;
?????????? 3.實(shí)用的線性代數(shù)谁不、傅里葉變換和隨機(jī)數(shù)生成函數(shù)茅逮。
?????????? 線性代數(shù)是數(shù)學(xué)的一個(gè)分支氓鄙,它的研究對象是向量荆忍,向量空間(或稱線性空間)本冲,線性變換和有限維的線性方程組厨埋。
?????????? 傅立葉變換邪媳,表示能將滿足一定條件的某個(gè)函數(shù)表示成三角函數(shù)(正弦和/或余弦函數(shù))或者它們的積分的線性組合。
提供了許多高級的數(shù)值編程工具,如矩陣數(shù)據(jù)類雨效、矢量處理迅涮,以及精密的運(yùn)算庫。
為什么要使用數(shù)組對象徽龟?
1.數(shù)組對象可以去掉元素間運(yùn)算所需的循環(huán)叮姑,使一維向量更像單個(gè)數(shù)據(jù)
2.設(shè)置專門的數(shù)組對象,經(jīng)過優(yōu)化据悔,可以提升這類應(yīng)用的運(yùn)算速度
???? 觀察:科學(xué)計(jì)算中传透,一個(gè)維度所有數(shù)據(jù)的類型往往相同
3.數(shù)組對象采用相同的數(shù)據(jù)類型,有助于節(jié)省運(yùn)算和存儲(chǔ)空間
例:計(jì)算a2+b3,其中极颓,a和b是一維數(shù)組
基礎(chǔ)知識(shí)
維度(dimensions)叫做軸(axes 原型:axis)
軸的個(gè)數(shù)叫做秩(rank)
例如朱盐,在3D空間一個(gè)點(diǎn)的坐標(biāo)[1,2,3]是一個(gè)秩為1的數(shù)據(jù),因?yàn)樗挥幸粋€(gè)軸菠隆。軸長度為3.
例如兵琳,在[[1.,0.,0.],[0.,1.,2.]]這個(gè)例子中,數(shù)組的秩為2(它有兩個(gè)維度)骇径。第一個(gè)維度長度為2躯肌,第二個(gè)維度長度為3.
Numpy的數(shù)組類被稱作ndarray,通常被稱作數(shù)組破衔。
ndarray是一個(gè)多位數(shù)組對象清女,有兩部分構(gòu)成:
?????????? 實(shí)際的數(shù)據(jù)
??????????? 描述這些數(shù)據(jù)的元數(shù)據(jù)(數(shù)據(jù)維度、數(shù)據(jù)類型)
ndarray數(shù)組一般要求所有原屬類型相同(同質(zhì))运敢,數(shù)組下標(biāo)從0開始
注意:numpy.array和標(biāo)準(zhǔn)python庫類array.array并不相同校仑,后者只處理一維數(shù)組和提供少量功能。
ndarray對象屬性主要見下表:例如其中.shape表示數(shù)組的維度传惠,.size表示數(shù)組元素的個(gè)數(shù)迄沫。
ndarray.ndim? 秩,即軸的數(shù)量或維度的數(shù)量
ndarray.shape? 數(shù)組的維度卦方,這是一個(gè)指示數(shù)組在每個(gè)維度上大小的整數(shù)元祖羊瘩。(ndarray對象的尺度,對于矩陣盼砍,n行m列)
ndarray.size?? 數(shù)組元素的總個(gè)數(shù)尘吗,等于shape屬性中元組元素的乘積。(ndarray對象的個(gè)數(shù)浇坐,相當(dāng)于.shape中n*m的值)
ndarray.itemsize? 數(shù)組中每個(gè)元素字節(jié)的大小睬捶。
ndarray.dtype?? 一個(gè)用來描述數(shù)組中元組類型的對象,可以通過使用標(biāo)準(zhǔn)python類型創(chuàng)造dtype.
ndarray.data????? 包含實(shí)際數(shù)組元素的緩沖區(qū)近刘,通常我們通過索引引用數(shù)組元素擒贸,不使用這個(gè)屬性
ndarray的元素類型
bool??????? 布爾類型臀晃,true或false
intc???????? 與c語言中的int類型一致,一般是int32或int64
intp????????? 用于索引的整數(shù)介劫,與c語言中ssize_t一致徽惋,int32或int64
int8????????? 字節(jié)長度的整數(shù),取值:[-128,127]
int16? ? ? ? 16位長度的整數(shù)座韵,取值:[-32768,32768]
int32? ? ? ? ? 32位長度的整數(shù)险绘,取值:[-2^31,2^31-1]
int64? ? ? ? ? 64位長度的整數(shù),取值:[-2^63,2^63-1]
uint8??????? 8位無符號整數(shù)誉碴,取值:[0宦棺,255]
uint16? ? ? ? 16位無符號整數(shù),取值:[0翔烁,65535]
uint32? ? ? ? 32位無符號整數(shù)渺氧,取值:[0,2^32-1]
uint64? ? ? ? 64位無符號整數(shù)蹬屹,取值:[0,2^64-1]
float16?????? 16位半精度浮點(diǎn)數(shù):1位符號位白华,5位指數(shù)慨默,10位尾數(shù)
float32? ? ? 32位半精度浮點(diǎn)數(shù):1位符號位,8位指數(shù)弧腥,23位尾數(shù)
float64? ? ? 64位半精度浮點(diǎn)數(shù):1位符號位厦取,11位指數(shù),52位尾數(shù)
complex64?? 復(fù)數(shù)類型管搪,實(shí)部和虛部都是32位浮點(diǎn)數(shù)
complex128? 復(fù)數(shù)類型虾攻,實(shí)部和虛部都是64位浮點(diǎn)數(shù)
?????????????????????? 實(shí)部(.real)+j虛部(.imag)
ndarray為什么要支持這么多種元素類型?
對比:python語法僅支持整數(shù)更鲁、浮點(diǎn)數(shù)和復(fù)數(shù)3種類型
1.科學(xué)計(jì)算設(shè)計(jì)數(shù)據(jù)較多霎箍,對存儲(chǔ)和性能都有較高要求
2.對元素類型精細(xì)定義,有助于numpy合理使用儲(chǔ)存空間并優(yōu)化性能
3.對元素類型精細(xì)定義澡为,有助于程序員對程序規(guī)模有合理評估
ndarray數(shù)組可以由非同質(zhì)對象構(gòu)成 np.array([0,1,2,3,4],[9,8,7,6])
非同質(zhì)ndarray元素為對象類型? dtype = object
非同質(zhì)ndarray對象無法有效發(fā)揮numpy優(yōu)勢漂坏,盡量避免使用
創(chuàng)建數(shù)組(方法一)
創(chuàng)建數(shù)組的方法有多種,比如可以使用array函數(shù)利用常規(guī)的python列表和元組創(chuàng)造數(shù)組媒至。所創(chuàng)建的數(shù)組類型由原序列中的元素類型決定顶别。
x= np.array(list/tuple,dtype=np.float32)
示例如下:
創(chuàng)建數(shù)組(方法二)
numpy提供了一些使用占位符創(chuàng)建數(shù)組的函數(shù)
例如:
函數(shù)zeros(shape)創(chuàng)建一個(gè)全是0的數(shù)組,
函數(shù)ones(shape)創(chuàng)建一個(gè)全1的數(shù)組拒啰,
函數(shù)empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴與內(nèi)存狀態(tài)的數(shù)組
函數(shù)full(shape驯绎,val) 根據(jù)shape生成一個(gè)數(shù)組,每個(gè)元素值都是val
函數(shù)eye(n)創(chuàng)建一個(gè)正方的n*n的單位矩陣谋旦,對角線為1剩失,其余都是0
默認(rèn)創(chuàng)建的數(shù)組類型(dtype)都是float64.示例如下:
zeros((3,4))
ones((2,3,4),dtype = int16)
#2個(gè)維度骗随,每個(gè)維對里有3個(gè)數(shù)組,每個(gè)數(shù)組里4個(gè)元素
empty((2,3))
np.eye(5)
創(chuàng)建數(shù)組(方法三)
此外numpy提供一個(gè)arange的函數(shù)返回?cái)?shù)組赴叹,示例如下:
arange(10,30,5)
arange(0,2,0.3)
其他創(chuàng)建方法
np.ones_like(a)???? 根據(jù)數(shù)組a的形狀生成一個(gè)全1數(shù)組
np.zeros_like(a)? ? 根據(jù)數(shù)組a的形狀生成一個(gè)全0數(shù)組
np.full_like(a鸿染,val)? ? 根據(jù)數(shù)組a的形狀生成一個(gè)數(shù)組,每個(gè)元素值都是val
np.linspace()? ? 根據(jù)起止數(shù)據(jù)等間距地填充數(shù)據(jù),形成數(shù)據(jù)
np.concatenate()? 將兩個(gè)或多個(gè)數(shù)組合成一個(gè)新的數(shù)組
打印數(shù)組
打印數(shù)組時(shí)乞巧,numpy以類似嵌套列表的形式顯示
?示例如下:其中一維數(shù)組被打印成行涨椒,二維數(shù)組成矩陣,三維數(shù)組成矩陣列表
ndarray數(shù)組的變換
對于創(chuàng)建后的ndarray數(shù)組绽媒,可以對其進(jìn)行緯度變換和元素類型變換
a = np.ones((2,3,4),dtype = np.int32)
.reshape(shape)???? 不改變數(shù)組元素蚕冬,返回一個(gè)shape形態(tài)的數(shù)組,原數(shù)組不變
.resize(shape)??????? 與.reshape()功能一致是辕,但修改原數(shù)組
.swapaxes(ax1,ax2)??? 將數(shù)組n個(gè)維度中兩個(gè)維度進(jìn)行調(diào)換
.flatten()????????????????? 對數(shù)組進(jìn)行降維囤热,返回折疊后的一堆數(shù)組,原數(shù)組不變
ndarray數(shù)組的維度變換
基本運(yùn)算
數(shù)組的算術(shù)運(yùn)算是按元素進(jìn)行获三。
???????? numpy中的乘法運(yùn)算符*指示按元素計(jì)算
矩陣乘法可以使用dot函數(shù)或創(chuàng)建矩陣對象實(shí)現(xiàn)旁蔼。
numpy一元函數(shù)
對ndarray中的數(shù)據(jù)執(zhí)行元素級運(yùn)算的函數(shù)
np.abs(x)? np.fabs(x)? 計(jì)算數(shù)組各元素的絕對值
np.sqrt(x)?? 計(jì)算數(shù)組各元素的平方根
np.square(x)? 計(jì)算數(shù)組各元素的平方
np.log(x)?? np.log10(x)? np.log2(x)?? 計(jì)算數(shù)組各元素的自然對數(shù)、10底對數(shù)和2底對數(shù)
np.ceil(x)?? np.floor(x)?? 計(jì)算數(shù)組各元素的ceiling值或floor值
np.rint(x)?? 計(jì)算數(shù)組各元素的四舍五入值
np.modf(x)?? 將數(shù)組各元素的小數(shù)和整數(shù)部分以兩個(gè)獨(dú)立數(shù)組形式返回
np.cos(x)? np.cosh(x) np.sin(x)? np.sinh(x)? np.tan(x)? np.tanh(x)? 計(jì)算數(shù)組各元素的普通型和雙曲型三角函數(shù)
np.exp(x)?? 計(jì)算數(shù)組各元素的指數(shù)值
np.sign(x)?? 計(jì)算數(shù)組各元素的符號值疙教,1(+),0,-1(-)
+ 1 * / **???? 兩個(gè)數(shù)組各元素進(jìn)行對應(yīng)運(yùn)算
np.maxinum(x,y)? np.fmax()? np.minimum(x,y)? np.fmin()? 元素級的最大值/最小值計(jì)算
np.mod(x.y)??? 元素級的模運(yùn)算
np.copysign(x,y)?? 將數(shù)組y中各元素值的符號賦值給數(shù)組x對應(yīng)元素
>? <? >=? <= == !=?? 計(jì)算比較棺聊,產(chǎn)生布爾型數(shù)組
?? ? ? ? ? 示例如下:
a=array([20,30,40,50])
b=arange(4)
打印b? array=([0,1,2,3])
c =a-b
打印 c? array=([20,29,38,47])
b**2
打印得 array([0,1,4,9])
10*sin(a)
打印得 array([9.12945251,-9.88031624,7.4511316,-2.62374854])
a<35
打印得 array([True,True,False,False],dtype = bool)
非數(shù)組的運(yùn)算可以利用ndarray類方法實(shí)現(xiàn)
通用函數(shù)(ufunc)--Nunpy提供常見的數(shù)學(xué)函數(shù)
如sin,cos和exp
在numpy里這些函數(shù)作用桉數(shù)組的元素運(yùn)算贞谓,產(chǎn)生一個(gè)數(shù)組作為輸出限佩。示例如下:
a =random.random((2,3))
打印結(jié)果:array([[0.52732678,0.92066148,0.25701814],[0.66596685,0.24443251,0.39027655]])
a.sum()
打印結(jié)果:3.0056823003535524
a.min()
打印結(jié)果:0.224443250574359088
a.max()
打印結(jié)果:0.92066148305911222
b = arange(12).reshape(3,4)
打印結(jié)果:array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
b.sum(axis=0)
打印結(jié)果:array([12,15,18,21])
b.min(axis = 1)
打印結(jié)果:array([0,4,8])
b.cumsum(axis = 1)
打印結(jié)果:array([[0,1,3,6],[4,9,15,22],[8,17,27,38]],dtype=int32)
索引、切片與迭代
索引:獲取數(shù)組中特定位置元素的過程
切片:獲取數(shù)組元素子集的過程
數(shù)組還可以被索引裸弦、切片和迭代祟同,示例如下:
a =arange(10)**3
打印結(jié)果:array([0,1,8,27,64,125,216,343,512,729],dtype=int32)
a[2]
打印結(jié)果:8
a[2:5]
打印結(jié)果:array([8,27,64],dtype=int32)
a[:6:2] = -1000
打印結(jié)果:array([-1000,1,-1000,27,-1000,125,216,343,512,729],dtype=int32)
a[::-1]
打印結(jié)果:array([729.512,343,216,125,-1000,27,-1000,1,-1000],dtype = int32)
矩陣運(yùn)算
Numpy對于多維數(shù)組的運(yùn)算,缺省情況下并不適用矩陣運(yùn)算理疙,對數(shù)組進(jìn)行矩陣運(yùn)算晕城,可調(diào)用相應(yīng)的函數(shù)。
numpy庫也提供了matrix類沪斟,使用matrix類創(chuàng)建的是矩陣對象广辰,他們的加減乘除運(yùn)算缺省采用矩陣方式計(jì)算,用法和matlab十分類似主之。
矩陣中更高級的一些運(yùn)算可以在numpy的線性代數(shù)子庫linalg中找到择吊。例如inv函數(shù)計(jì)算逆矩陣,solve函數(shù)可以求解多元一次方程組槽奕。
數(shù)據(jù)的csv文件存取
csv(comma-separated value,逗號分隔值)
產(chǎn)生是一種常見的文件格式几睛,用來存儲(chǔ)批量數(shù)據(jù)
np.savetxt(frame,array,fmt='%.18e',delimiter=None)
frame:文件、字符串或產(chǎn)生器粤攒,可以是.gz或.bz2的壓縮文件
array:存入文件的數(shù)組
fmt:寫入文件的格式所森,例如:%d?? %.2f? %.18e
delimiter:分割字符串囱持,默認(rèn)是任何格式
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
frame:文件、字符串或產(chǎn)生器焕济,可以是.gz或.bz2的壓縮文件
dtype:數(shù)據(jù)類型纷妆,可選
delimiter:分割字符串,默認(rèn)是任何空格
unpack:如果true晴弃,讀入屬性將分別寫入不同變量
csv只能有效存儲(chǔ)一維和二維數(shù)組
np.savetxt()? np.loadtxt()只能有效存取一維和二維數(shù)組
多維數(shù)組的存取
a.tofile(frame,sep='',format='%s')
frame:文件掩幢、字符串
sep:數(shù)據(jù)分割字符串,如果是空串上鞠,寫入文件為二進(jìn)制
format:寫入數(shù)據(jù)的格式
np.fromfile(frame,dtype = float,count = -1,sep='')
frame:文件际邻、字符串
dtype:讀取的數(shù)據(jù)類型
count:讀入元素個(gè)數(shù),-1表示讀入整個(gè)文件
sep:數(shù)據(jù)分割字符串芍阎,如果是空串世曾,寫入文件為二進(jìn)制
需要注意
改方法需要讀取時(shí)知道存入文件時(shí)數(shù)組的維度和元素類型
a.tofile()和np.fromfile()需要配合使用
可以通過元數(shù)據(jù)文件來存儲(chǔ)額外信息
numpy的便捷文件存取
np.save(fname,array) 或 np.savez(fname,array)
fname:文件名,以.npy為擴(kuò)展名谴咸,壓縮擴(kuò)展名為.npz
array:數(shù)組變量
np.load(fname)
fname:文件名轮听,以.npy為擴(kuò)展名,壓縮擴(kuò)展名為.npz
numpy的隨機(jī)函數(shù)子庫?
numpy的rando子庫?? np.random.*
np.random.rand()????? np.random.randn()???? np.random.randint()
rand(d0,d1...,dn)???? 根據(jù)d0-dn創(chuàng)建隨機(jī)數(shù)數(shù)組寿冕,浮點(diǎn)數(shù)蕊程,[0,1],均勻分布
randn(d0,d1...,dn)? ? 根據(jù)d0-dn創(chuàng)建隨機(jī)數(shù)數(shù)組,標(biāo)準(zhǔn)正態(tài)分布
randint(low[,high,shape])?? 根據(jù)shape創(chuàng)建隨機(jī)整數(shù)或整數(shù)數(shù)組驼唱,范圍是[low,high]
seed(s)?????? 隨機(jī)數(shù)種子,s是給定的種子值
? ? ??????????????? 給隨機(jī)數(shù)對象一個(gè)種子值驹暑,用于產(chǎn)生隨機(jī)序列玫恳。
??????????????????? 對于同一個(gè)種子值的輸入,之后產(chǎn)生的隨機(jī)數(shù)序列也一樣优俘。
???????????????????? 通常是把時(shí)間秒數(shù)等變化值作為種子值京办,達(dá)到每次運(yùn)行產(chǎn)生的隨機(jī)系列都不一樣
???????????????????? seed() 省略參數(shù),意味著使用當(dāng)前系統(tǒng)時(shí)間生成隨機(jī)數(shù)
shuffle(a)?????????????? 根據(jù)數(shù)組a的第1軸進(jìn)行隨排列帆焕,改變數(shù)組x
permutation(a)??????? 根據(jù)數(shù)組a的第一軸產(chǎn)生一個(gè)新的亂序數(shù)組惭婿,不改變數(shù)組x
choice(a[,size,replace,p])??? 從一維數(shù)組a中以概率抽取元素,形成size形狀新數(shù)組replace表示是否可以重用元素叶雹,默認(rèn)為false
uniform(low,high,size)? 產(chǎn)生具有均勻分布的數(shù)組财饥,low起始值,high結(jié)束值折晦,size形狀
normal(loc,scale,size)?? 產(chǎn)生具有正態(tài)分布的數(shù)組钥星,loc均值,scale標(biāo)準(zhǔn)差满着,size形狀
poisson(lam,size)???????????? 產(chǎn)生具有泊松分布的數(shù)組谦炒,lam隨機(jī)事件發(fā)生率贯莺,size形狀
numpy的統(tǒng)計(jì)函數(shù)
sum(a,axis=None)???? 根據(jù)給定軸axis計(jì)算數(shù)組a相關(guān)元素之和,axis整數(shù)或元組
mean(a,axis=None)??? 根據(jù)給定軸axis計(jì)算組a相關(guān)元素的期望宁改,axis整數(shù)或元組
average(a,axis=None,weights=None)?? 根據(jù)給定軸axis計(jì)算數(shù)組a相關(guān)元素的加權(quán)平均值
std(a,axis=None)??????? 根據(jù)給定軸axis計(jì)算數(shù)組a相關(guān)元素的標(biāo)準(zhǔn)差
var(a,axis=None)??????? 根據(jù)給定軸axis計(jì)算數(shù)組a相關(guān)元素的方差
min(a)??? max(a)???? 計(jì)算數(shù)組a中元素的最小值缕探、最大值
argmin(a)??? argmax(a)????? 計(jì)算數(shù)組a中元素最小值、最大值的降一維后下標(biāo)
unravel_index(index,shape)????? 根據(jù)shape將一維下標(biāo)index轉(zhuǎn)換成多維下標(biāo)
ptp(a)??????????????? 計(jì)算數(shù)組a中元素最大值與最小值的差
median(a)?????????? 計(jì)算數(shù)組a中元素的中位數(shù)(中值)
numpy的梯度函數(shù)
np.gradient(f)?????? 計(jì)算數(shù)組f中元素的梯度还蹲,當(dāng)f為多維時(shí)爹耗,返回每個(gè)維度梯度
梯度:連續(xù)值之間的變化率,即斜率
xy坐標(biāo)軸連續(xù)三個(gè)x坐標(biāo)對應(yīng)的y軸值:a秽誊,b鲸沮,c玖详,其中啦吧,b的梯度是:(c-a)/2