Python科學(xué)計(jì)算


$$\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ù)組

  1. persontype = np.dtype({'names':['name1','name2',...], 'formats':['S32','i']}, [align = True]) ←內(nèi)存對(duì)齊
  2. np.dtype([('name1','|S32'),('name2','i'),...])
  3. 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.flagsOWNDATA学少,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])
  • subtractmultiply
  • divide/)版确,true_divide/返回精確)扣囊,floor_divide//返回取整)
    • _future_.division
  • negative-)绒疗,power**
  • remaindermod
  • 表達(dá)式不能太復(fù)雜:自動(dòng)的中間變量

關(guān)系運(yùn)算

  • equal侵歇,not_equalless吓蘑,less_equal惕虑,greatergreater_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]
  • <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)維的值)

函數(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ù)

  • 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)
    • funclistcondlist長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)(最小,最大)
    • normedFalse統(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,...
  • 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")
    • dtpyeNumpy類型;offset讀文件起始位置偏移选侨,字節(jié)單位掖鱼;orderC/Fortran
    • moder只讀;c修改但不寫入文件援制;r+數(shù)組可讀寫戏挡,結(jié)果寫入文件;w+創(chuàng)建或覆蓋已有文件(可以缺省filename
  • a.flush()把a(bǔ)的值按mode規(guī)定的規(guī)則寫入(有的就不能寫入)

[TOC]

matplotlib

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晨仑,一起剝皮案震驚了整個(gè)濱河市褐墅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洪己,老刑警劉巖妥凳,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異答捕,居然都是意外死亡逝钥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門噪珊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晌缘,“玉大人齐莲,你說我怎么就攤上這事痢站。” “怎么了选酗?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵阵难,是天一觀的道長。 經(jīng)常有香客問我芒填,道長呜叫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任殿衰,我火速辦了婚禮朱庆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闷祥。我一直安慰自己娱颊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箱硕,像睡著了一般拴竹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剧罩,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天栓拜,我揣著相機(jī)與錄音,去河邊找鬼惠昔。 笑死幕与,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镇防。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼赏陵,長吁一口氣:“原來是場噩夢啊……” “哼饲漾!你這毒婦竟也來了蝙搔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤考传,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后僚楞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泉褐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年赐写,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膜赃。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跳座,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疲眷,到底是詐尸還是另有隱情,我是刑警寧澤狂丝,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布虚倒,位于F島的核電站产舞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏耻煤。R本人自食惡果不足惜准颓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攘已。 院中可真熱鬧,春花似錦吠勘、人聲如沸峡眶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸡挠,卻和暖如春搬男,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背止后。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挺益。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓望众,卻偏偏與公主長得像伞辛,于是被迫代替她去往敵國和親夯缺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚤氏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容