$$\mathrm{《Python科學(xué)計(jì)算》學(xué)習(xí)筆記}$$
[TOC]
Numpy
數(shù)組入門
數(shù)組創(chuàng)建
-
np.array
:數(shù)組 -
a.shape =
:原地變換. -
b = a.reshape((...))
:變換后失息,內(nèi)容共享! a.dtype
np.arange(始,末不含,步長)
-
np.linspace()
,[endpoint=False]
logspace([base = x])
a = np.fromstring(s,dtype = int)
a = np.fromfunction(func,(10,))
- 對(duì)于
array
的切片賦值蛙紫,內(nèi)容共享(這和list列表不同)
下標(biāo)方法
- 切片賦值厢漩,內(nèi)容共享(這和list列表不同)
- 整數(shù)列表存取氓辣,不共享
- bool數(shù)組鼻疮,不共享
- 不能用bool列表琳水,否則等同于0这吻,1的整數(shù)列表存取
多維數(shù)組
- 二維數(shù)組:
a = b(列數(shù)組) + c(行數(shù)組)
- 數(shù)組下標(biāo)是一個(gè)元組5醯怠(不是slice)
多維數(shù)組存取
- 特例:
整數(shù),整數(shù)
:返回得到內(nèi)容數(shù)字,不是array
唾糯! - 整數(shù)看成切片怠硼,只有整數(shù)/切片,內(nèi)容共享(返回
array
)-
slice(a,b,c)
返回切片 -
np.s_[::2,2:]
生成切片
-
- 只要有元組/列表移怯,bool數(shù)組任何一個(gè)香璃,內(nèi)容不共享
- 如果元組/列表只有一個(gè)數(shù)字,當(dāng)作數(shù)字->切片處理舟误,但依然不共享
- 元組/列表非單個(gè)數(shù)字部分必須所有維數(shù)長度一致葡秒,用于一一對(duì)應(yīng)(不同于切片作用)
- 剩余維數(shù)對(duì)應(yīng)下標(biāo)
:
結(jié)構(gòu)數(shù)組
-
persontype = np.dtype({'names':['name1','name2',...], 'formats':['S32','i']}, [align = True])
←內(nèi)存對(duì)齊 np.dtype([('name1','|S32'),('name2','i'),...])
np.dtype({'name1':(類型,地址偏移),...})
-
a = np.array([("HKK",3),("KHH",4)],dtype = persontype)
-
|
忽視順序;<
低位字節(jié)在前;>
高位字節(jié)在前
-
a[0]['name1']
-
a.tofile('test.dat')
寫入二進(jìn)制文件 -
b = a['name1']
內(nèi)容共享 - 元素為一個(gè)數(shù)組的定義方法2:
('name','type',(維度長度))
數(shù)組的存儲(chǔ)細(xì)節(jié)
-
stride
各維地址偏移量眯牧,dimensions
各維長度蹋岩,dim count
維數(shù) -
np.array([order="F"])
:數(shù)組按Fortan方式存儲(chǔ),即列優(yōu)先 as_strided(a,shape = , strides = )
- 查詢
-
a.flags
的OWNDATA
学少,C_CONTIGUOUS
剪个,F_CONTIGUOUS
id(b.base) == id(a)
-
函數(shù)
ufunc
np.sin(x,[out = x])
-
math.sin()
(單獨(dú)運(yùn)算快)和np.sin()
(整個(gè)數(shù)組一起運(yùn)算快) -
a.item(*,*) ~ a[*,*]
但返回標(biāo)準(zhǔn)Python類型
數(shù)學(xué)運(yùn)算
-
y = x1 + x2
->np.add(x1,x2[,y])
-
subtract
,multiply
-
divide
(/
)版确,true_divide
(/
返回精確)扣囊,floor_divide
(//
返回取整)-
_future_.division
?
-
-
negative
(-
)绒疗,power
(**
) -
remainder
或mod
- 表達(dá)式不能太復(fù)雜:自動(dòng)的中間變量
關(guān)系運(yùn)算
-
equal
侵歇,not_equal
,less
吓蘑,less_equal
惕虑,greater
,greater_equal
- 均已重載
布爾運(yùn)算
- 無法重載原符號(hào)
-
np.logical_and(a==b , a>b)
相當(dāng)于a>=b
-
np.logical_or
士修,np.logical_not
枷遂,np.logical_xor
其它
- 位運(yùn)算:
np.bitwise_and, ...
相當(dāng)于&,|,~,^
- 對(duì)布爾數(shù)組 位運(yùn)算=關(guān)系運(yùn)算SV浴(但注意優(yōu)先級(jí)變了)
-
any()
棋嘲,all()
自定義ufunc函數(shù)
- 一般函數(shù):
somefun(x,c1)
- 可對(duì)數(shù)組操作函數(shù):
ufunc = np.frompyfun(somefun,2,1)
(輸入個(gè)數(shù),輸出個(gè)數(shù)) -
y = ufunc(x,c1)
(x可以是數(shù)組) -
y = y.astype(np.float)
(必須改類型)(astype
產(chǎn)生新數(shù)組)
廣播
- 維度數(shù)目不同矩桂,少的在低維添長為1的維
- 對(duì)應(yīng)維運(yùn)算沸移,某維長為1的運(yùn)算當(dāng)作復(fù)制為需要長度;長度不為1的侄榴,如果長度不同雹锣,報(bào)錯(cuò)
- 新產(chǎn)生廣播(結(jié)果有用維1維):
x,y = np.ogrid[:5,:5]
-
np.ogrid[:1:4j,:1:3j]
表示0-1中4個(gè)值/3個(gè)值(相當(dāng)linspace
)
-
- (結(jié)果有用維多維):
x,y = np.mgrid[:5,:5]
- 已有數(shù)組產(chǎn)生廣播(結(jié)果有用維1維):
gy,gx = np.ix_(y,x)
ufunc函數(shù)方法
-
<operation>.reduce(array [,axis = 0, dtype = None])
- 數(shù)組元素連續(xù)運(yùn)算,只給最后結(jié)果
-
<op>.accumulate(...)
:類似reduce
但是癞蚕,結(jié)果與輸入維數(shù)相同蕊爵,給中間結(jié)果 -
<op>.reduceat(array, indices = [...])
:結(jié)果和indices長度相同- 前小后大連續(xù)算;前大后小給那個(gè)值桦山;最后一個(gè)連續(xù)算到
[-1]
- 前小后大連續(xù)算;前大后小給那個(gè)值桦山;最后一個(gè)連續(xù)算到
-
<op>.out(array1, array2)
:產(chǎn)生二維數(shù)組攒射,是一個(gè)組合運(yùn)算結(jié)果表
多維數(shù)組下標(biāo)存取
- 下標(biāo)是元組,應(yīng)盡量顯式使用元組表示下標(biāo)
- 下標(biāo):整數(shù)恒水;切片会放;整數(shù)數(shù)組(列表/元組則轉(zhuǎn));布爾數(shù)組
- 只有整數(shù)數(shù)組:
- 各維數(shù)組廣播钉凌,取對(duì)應(yīng)維的值咧最,結(jié)果與廣播后維度、長度相同
-
ind0, ind1, ind2 = np.broadcast_arrays(i0,i1,i2)
與b = a[i0,i1,i2]
- 整數(shù)數(shù)組+切片
- 切片的那一維造成的維度全部往后放,廣播造成的維度靠前
- 整數(shù)矢沿、單個(gè)元素的整數(shù)數(shù)組造成的效果與切片
[..., 2:3,...]
效果不同滥搭,不產(chǎn)生任何結(jié)果維度上的影響,只是該維下標(biāo)釘死
- 布爾數(shù)組下標(biāo)
- 相當(dāng)于使用
np.nonzero(b)
(b
有幾維捣鲸,結(jié)果有幾個(gè)數(shù)組組成的元組论熙,表示True
元素下標(biāo)的對(duì)應(yīng)維的值)
- 相當(dāng)于使用
函數(shù)庫
基本函數(shù)
- 求和:
np.sum(a [,axis = None, dtype = ***, out = ])
-
axis
不填則為整個(gè)求和,dtype
數(shù)據(jù)較多時(shí)要用精度高的
-
- 平均值:
np.mean(a [,axis = None, dtype = ***, out = ])
- 整數(shù)默認(rèn)用雙精度浮點(diǎn)數(shù)算
-
std()
:標(biāo)準(zhǔn)差摄狱;var()
:方差
最值與排序
- 產(chǎn)生隨機(jī)數(shù)組:
a = np.random.randint(0,10,size=(4,5))
-
min()
max()
ptp()
(極差)-
axis
out
參數(shù)
-
-
np.argmax()
np.argmin()
第一次出現(xiàn)的位置- 不指定
axis
參數(shù)脓诡,給平坦化后位置 - 平坦化:
a.ravel()
(不改變a) - 從平坦化位置轉(zhuǎn)成多維下標(biāo):
idx = np.unravel_index(num, a.shape)
- 不指定
- 從小到大排序:
np.sort(a [, axis = -1])
- 返回新數(shù)組
- 平坦化排序:
axis = None
- 排序下標(biāo):
idx = np.argsort(a [, axis = -1])
- 返回值表示:原來在該值為下標(biāo)的那個(gè)數(shù)字放到現(xiàn)在這個(gè)值的位置上,見下
a[idx] == np.sort(a)
- 中位數(shù):
np.median(a [,axis = -1])
多項(xiàng)式
- 一元多項(xiàng)式:
p = np.poly1d(a)
媒役,a是數(shù)組祝谚,高次項(xiàng)在左邊-
p()
像函數(shù)一樣用
-
-
p + [1,2]
p*p
p/[1,1]
(返回商式和余式) - 求導(dǎo):
p.deriv()
;積分:p.integ()
- 求根:
r = np.roots(p)
:返回多個(gè)根放在一個(gè)數(shù)組里酣衷,p(r) == array([0,0,0,...])
- 從根轉(zhuǎn)回多項(xiàng)式系數(shù):
np.poly(r)
交惯,返回系數(shù)數(shù)組 - 擬合:
a = np.polyfit(x,y,deg)
(deg
最高次指數(shù)),返回系數(shù)數(shù)組- 通過系數(shù)數(shù)組計(jì)算多項(xiàng)式值:
np.polyval(a,x)
- 通過系數(shù)數(shù)組計(jì)算多項(xiàng)式值:
分段函數(shù)
-
x = where(condition, y, z)
-
x
condition
y
z
是同樣維數(shù)數(shù)組 - C語言級(jí)別穿仪,比
frompyfunc()
快
-
-
select(condlist, choicelist, default = 0)
- 找
condlist
中最先滿足的 np.select([x>=c, x<c0], [0, x/c0*hc], default = (c-x)/(c-c0)*hc)
- 內(nèi)存開銷很大
- 找
-
piecewise(x, condlist, funclist)
-
funclist
比condlist
長1席爽,最后表示其它情況
-
-
lambda x : x**x
:創(chuàng)建簡單小函數(shù)
統(tǒng)計(jì)函數(shù)
- 找出數(shù)組中不同值,從小到大排:
x = np.unique(a)
-
return_index = True
:多返回idx
,a[idx] == x
-
return_inverse = True
:返回a中元素在x中的下標(biāo)
-
-
np.bincount(a [, weights = w])
非負(fù)整數(shù)數(shù)組啊片,元素出現(xiàn)次數(shù)統(tǒng)計(jì)-
w
權(quán)重只锻,和a
長度相同
-
- 直方圖統(tǒng)計(jì):
hist, bin_edges = np.histogram(a, bins = , range = None, normed = False, weights = None)
-
bins
區(qū)間數(shù),或給定的每個(gè)區(qū)間邊界列表(長度區(qū)間數(shù)+1) -
range
數(shù)據(jù)范圍紫谷,默認(rèn)(最小,最大)
-
normed
:False
統(tǒng)計(jì)個(gè)數(shù)齐饮,否則概率化 -
hist
:統(tǒng)計(jì)結(jié)果數(shù)組;bin_edges
:區(qū)間邊界數(shù)組(長度區(qū)間數(shù)+1)
-
線性代數(shù)
Matrix對(duì)象
a = np.matrix([[...],[...],[...]])
- 直接計(jì)算:
a* a**-1
- 后面不再用Matrix對(duì)象
dot乘積運(yùn)算
dot(x,y)
- 一維乘一維:相當(dāng)于行列相乘
- 請(qǐng)不要用一維乘二維:
x
一維笤昨,y
二維行向量不行祖驱;x
二維列,y
一維不行瞒窒;x
二維行向量捺僻,y
一維居然可以 - 多維乘多維
x[i1,i2,l,m], y[j1,j2,j3,m,n]
,結(jié)果z[i1,i2,l,j1,j2,j3,n]
inner乘積inner(x,y)
- 多維數(shù)組最后一維相乘求和(本質(zhì)就是一維乘一維崇裁,其它維不過相當(dāng)于列表)
-
x[i1,i2,m], y[j1,j2,j3,m]
匕坯,結(jié)果z[i1,i2,j1,j2,j3]
outer乘積outer(x,y)
- 列向量乘行向量!展成二維
- 輸入多維寇壳,先展平為一維
多元一次方程組
-
x = np.linalg.solve(a,b)
醒颖,a
是N*N二維數(shù)組,b
是N長一維數(shù)組壳炎,輸出N的一維數(shù)組 -
x = np.linalg.lstsq(a,b)
泞歉,a
是X*N數(shù)組逼侦,得最小二乘解 - 正態(tài)隨機(jī)數(shù):
np.random.standard_normal(len)
文件存取
底層二進(jìn)制存取
a.tofile("name.bin")
b = np.fromfile("name.bin",dtype = np.int32)
- 需要指定
dtype
,讀入后b.shape = (*,*)
- 指定
sep
參數(shù)腰耙,文本輸出/輸入榛丢,sep
是分隔符
高級(jí)二進(jìn)制存取
-
np.save("a.npy", a)
(單)- C語言格式
-
c = np.load("a.npy")
(單) -
np.savez("result.npz", a, b, newname = c)
(多)- 關(guān)鍵字參數(shù)給參數(shù)起名,非關(guān)鍵字默認(rèn):
arr_0,arr_1,...
- 關(guān)鍵字參數(shù)給參數(shù)起名,非關(guān)鍵字默認(rèn):
-
r = np.load("result.npz")
(多)-
r["arr_0"] =
r["newname"] =
-
高級(jí)文本存取
np.savetxt("a.txt", a [, fmt = '%.18e', delimiter = " "])
np.loadtxt("b.csv", delimiter = ",", dtype = np.***)
- 結(jié)構(gòu)存取
dtype = persontype
簡單的底層文本存取
f = file("test.csv")
f.readline()
data = np.loadtxt(f, delimiter = ",")
-
f = file("result.npy", "wb")
f = file("result.npy", "rb")
-
np.save(f,a)
np.load(f)
-
save
load
可連續(xù)使用挺庞,在文件中存取多個(gè)變量
-
內(nèi)存映射數(shù)組
- 從文件讀取的變量和文件內(nèi)容掛鉤晰赞,改變量也可以改文件
-
a = np.memmap(filename, deype = uint8, mode = "**", offset = 0, shape = None, order = "C")
-
dtpye
Numpy類型;offset
讀文件起始位置偏移选侨,字節(jié)單位掖鱼;order
C/Fortran -
mode
:r
只讀;c
修改但不寫入文件援制;r+
數(shù)組可讀寫戏挡,結(jié)果寫入文件;w+
創(chuàng)建或覆蓋已有文件(可以缺省filename
)
-
-
a.flush()
把a(bǔ)的值按mode
規(guī)定的規(guī)則寫入(有的就不能寫入)
[TOC]