讀的是numpy user guide release 1.3,官方另有一本reference,600多頁,還是先讀這個省事兒的。
凡例:a. [float]表示物件型別是float,用時不用加'['和']'。b. **中的跳格表示換行。
chap 2 numpy basics
1. import numpy as np,沿用之,很喜歡np這個名字,呵呵
2. np支援的資料型別:int8, int16, int32, int64, unit8(無符號的整數,unit8是0~255), unit16~64, float32, 64, complex64, 128, boolean。字母表示數字型別(dtype),後面的數字表示位數,即數值在記憶體中所佔的bit的數目(不明白~)。還有int, float和complex,其位數取決於平台型別,即16或者32位,complex也是,不過因為是兩個float表示的,所以位數是64或者128。還有更高階的型別。
3. 轉換資料型別:y=np.int_([1,2,3]),返回乙個np的array。
4. 生成array時指定資料型別:z=np.arange(3,dtype='f'/float),推薦後一種寫法。此處雖然寫的float,但np會自動把dtype轉換成np.flaot。z的轉換有兩種做法,或者通過類方法:z.astype(int8),或者通過函式:np.int8(z)。
5. 檢視資料型別。也有兩種做法,或通過類方法:z.dtype(),或通過函式:np.dtype(z),或者np.issubtype(d,int),返回bool值。
6. 建立array的五種方法:a. 從list轉換(tuple特殊對待,不轉換,見26);b. 內建函式建立(arange,ones,zeros(這個構建structured array時常用,見30)等等);c. 從檔案讀取;d. 直接從raw bytes構建(啥意思?);e. 借助某些庫里的函式生成。
7. 通過轉換生成array:x=np.array([1,2,3],[4,5,6])
8. 通過內建方法生成array:np.zeros((2,3)),返回array([0,0,0],[0,0,0]),即維度為2*3的矩陣。
9. arange,類似range,引數可以是小數或者負數,很實用!
10. np.linspaces,規定起點、終點(包含)、返回array的長度,返回乙個兩端點間數值平均分布的array。
11. np.indices沒看懂,似乎某些情況下可以很有用。
12. 直接從檔案讀取需借用其他庫里的方法,不熟,過。
13. x.shape = (2,5),指定維度,相當於r裡的c(2,5) <- dim(x)。也可以這樣用:y = x.reshape(5,7)。
14. array indexing和slicing跟python裡的一樣也是從0開始的。不同的是如果用index array去做reference的話返回的是乙個複本,而不是目標array裡的原數。這個原則適用於下面的數值和mask index array。這個特性使得賦值(assignment)運算有點奇特,見24。
15. 說到indexing,記一筆前幾天新學到的逆序排列的一招:x[::-1],其中x不限於list,只要是能slice的都行。其原理是x[[int1]:[int2]:[int3]],其中int1是起點,int2終點(不包含),int3是步長,負數則表示倒著來。如果int3<0 and int1
16. array indexing的輸入物件也要求是乙個array,比如:x[np.array([3, 3, 1, 8])]。也可以是:x[np.array([[1,1],[2,3]])],返回乙個同樣維度的array。
17. 多維array的indexing比較麻煩一些,個人認為基本方法就不大直觀:y[np.array([0,2,4]), np.array([0,1,2])]返回的是y[0,0],y[2,1]和y[4,2]。
18. 當然可能也有好處,比如如果取一行/列就為其中每個數指定行/列數,因為有自動broadcasting(不知道啥意思,猜測不止擴充套件或補齊的意思)功能:y[np.array([0,2,4]), 1]。
19. 不指定某乙個維度的index則取該維度所有值,如:y[np.array([0,2,4])],返回array的shape是index array的shape串聯上所有沒指定的維度的部分的shape。如這個例子中,y = np.arange(35).reshape(5,7),shape是5*7,沒有指定第二個維度則返回array的shape是3(index array的shape)*7(所有沒指定的維度的部分,即第二個維度,的shape)。
20. array資料篩選。我管這個叫filtering,user guide上叫mask index arrays。乙個指功用,乙個指手段。用法:y[y>=20],跟r裡的用法一樣。也可以繞一點,b=y>20,這樣生成乙個dtype=bool的array,然後又套在y裡:y[b]。還可以對b進行slicing,作為index array指定位置,如:y[b[:,5]],其中b[:,5]返回第一維度不限,第二維度是5的array,由於y是5*7的,返回array長度是5,shape是5*1。把這個array作為index array對y篩值,由於是個一維array,對於y來說第二維沒有指定,所以取全部的。b是array([false, false, false, true, true], dtype=bool),所以僅取第一維度的最後兩個,對於二維array來說就是最後兩行,每行7個數,返回的是乙個2*7的array。好繞啊,要是多於2維估計我就暈了~
21. index array和slicing的混搭:y[np.array([0,2,4]),1:3],工作原理還是跟index array的差不多,只不過1:3這個部分對第乙個array裡的每個數所代表的行都起作用(broadcast了)。也可以跟mask index array一起混搭。
22. 插入維度:y[:,np.newaxis,:].shape成了(5,1,7)。新增的維度裡面沒有元素,但運算時行為遵照新的array的適用原則,合併array時很有用:(x原為1*5的array)x[:,np.newaxis] + x[np.newaxis,:] ,返回的是乙個5*5的array。不然得賦值z,再指定z的shape等等,較為麻煩。還有一種比較無語的寫法:(z的shape是(3,3,3,3))z[1,...,2],相當於z[1,:,:,2]。(懶惰是向上的車輪!)
23. array slice賦值,跟python差不多,需要注意的是每個array都有自己的dtype,賦值型別不符的話會「降級」或者乾脆「出亂子」(raise exception啦)。
24. 賦值(assignment)的時候和reference時不一樣,總是array裡的原數發生變化(不然還賦個啥勁兒的呀),不過規則有點奇特。比如:x[np.array([1, 1, 3, 1]) += 1,array並非直接賦值,而是先被提取出來(extracted),然後逐個賦值,然後assign回去,在1這個位置的那個值被賦值3次,每次都是+=1之後的那個值,所以結果是1和3位置的值+=1。糾結呀~
25. 也可以將index array賦值給變數,然後用變數做indexing,就像20裡的那樣。可以混搭,可以懶人:indices = (1, ellipsis, 1),然後z[indices]
26. list和tuple做indexing結果是不一樣的,比如z[(1,1,1,1)]相當於z[1,1,1,1],僅返回乙個數,z[[1,1,1,1]]則返回乙個4*3*3*3的array(為什麼?z才3*3*3*3,怎麼會比z的還多??)。
27. broadcast的作用是使得不同shape的array在算術運算的時候shape相符,機制上broadcast使得迴圈在c中發生,這樣就比在python裡發生要快。缺點是額外占用記憶體,所以不要濫用啦。
28. 想要能夠利用broadcast必須滿足兩個條件:從後向前匹配,同一維度上的數值相等,或者至少其中為1。維度數目不一定要求一樣。如果是一維的則會自動往另外乙個array數值相等或者為1的那個維度上靠。
29. 預設結構模板的array(structured array或稱record array):元素是一組物件組成的tuple,型別已經指定。
30. structured array的dtype引數型別有四種:a. 字串,包括b1, i1, i2, i4, i8, u1, u2, u4, u8, f4, f8, c8, c16, a,分別代表bytes,整數,無符號整數,浮點數和byte長度一定的字串,還有一些數:int8,...,uint8,...,float32, float64, complex64, complex128。定義的時候很靈活,比如:x = np.zeros(3, dtype=』3int8, float32, (2,3)float64』),返回的array長度為3,元素是array([([0, 0, 0], 0.0, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])。
先告一段落吧,ms user guide看完第二章就沒我啥事兒了,後面都是擴充套件之類的,離那境界還挺遠呢。
NumPy簡明教程(二 陣列1)
numpy陣列是乙個多維陣列物件,稱為ndarray。其由兩部分組成 大部分操作僅針對於元資料,而不改變底層實際的資料。關於numpy陣列有幾點必需了解的 在詳細介紹numpy陣列之前。先詳細介紹下numpy陣列的基本屬性。numpy陣列的維數稱為秩 rank 一維陣列的秩為1,二維陣列的秩為2,以...
numpy簡明教程 2
31.第二個引數型別是tuple,僅在將structure對映到乙個已有的資料型別上時使用,即在tuple裡已有的資料型別以及資料型別定義,比如 x zeros 3,dtype i4 r u1 g u1 b u1 a u1 這樣就覆蓋了預設名稱 f0,f1之類 不過返回沒搞明白,為啥是乙個1 3的a...
NumPy簡明教程(一 簡介)
用python在arcgis的開發中,對numpy的接觸越來越多,從現在開始就將以前的numpy筆記整理一下,慢慢放出來。供有需要的朋友參考。python 中提供了list 容器,可以當作陣列使用。但列表中的元素可以是任何物件,因此列表中儲存的是物件的指標,這樣一來,為了儲存乙個簡單的列表 1,2,...