繼續Numpy基礎...
1. Fancy Indexing
指的是用一個整數array來當做index下標,比如:arr[[4,3,0,6]] ,中間的那個array就是一個fancy indexing形式。也可以是負數形式,如arr[[-3,-5,-7]];
當傳進的參數是multiple index arrays時,會選擇各個array的相同下標,做爲一個下標,比如:
arr = np.arange(32).reshape((8,4))
arr[[1,5,7,2],[0,3,1,2]]
會把[1,0]做爲一個index,[5,3],[7,1],[2,2]分別做爲下標取對應的元素值;
維數再高也是類似,當然,也可以缺省一個下標,表示,這一維的所有元素都取出,或者在上面採用slice indexing。
另外,還可以利用下標取值,並打亂其在某維度的順序,比如:
可以看到,取出了1,5,7,2維度的所有值,並在那一維中使用順序[0,3,1,2]做爲新的順序;
上述也可以用np.ix_() 函數實現,該函數傳遞兩個參數,第一個做爲要選取的1D arrays index,第二個表示1D中的順序;
注意:fancy indexing和slicing不同,它通常將元素拷貝到新的array中。
2. Transposing Arrays and Swapping Axes
用arr.T來表示轉置矩陣;
可以用np.dot(arr.T,arr)來計算兩矩陣的內積(inner product) XTX;
arr.swapaxes(a,b):輸入兩個軸的編號,將兩個軸轉置,當arr爲2維時,輸入0,1;即表示arr.T;當爲高維時,需要考慮它會出現什麼結果。swapaxes與slicing類似,不返回新的array。
arr.transpose((...)):輸入一個List表示轉置後,之前的各個軸所在的位置;如arr.transpose((1,0,2))表示將軸0和軸1交換,等價於arr.swapaxes(0,1)。通常transpose()可以看做是一個或多個swapaxes()的結果。
3. Universal Functions: Fast Element-wisearray functions
通用函數,是一些對元素進行數學操作的函數,可以看出是vectorization的操作;如sqrt和exp;
常用的一元ufuncs函數:
常用的二元ufuncs函數:
4. Data Processing using Arrays
使用Numpy的arrays可以讓本來需要寫許多loops的操作可以用array表示,這種以array表示來替代loops的操作通常叫做vectorization;通常情況下,使用向量化的操作要比單純的用python語言來計算速度要快上數倍。
np.meshgrid():給定兩個1D的array,生成兩個2D的matrices,大小爲m*n,n爲第一個array的長度,m爲第二個array的長度;第一個matrix以第一個array爲行,構造m行,爲m*n矩陣;第二個matrix以第二個array爲列,構造n列,爲m*n矩陣;如:
x = np.arange(3)
y = np.arange(2)
xs, ys = np.meshgrid(x,y)
結果爲:
遇到個問題:
matplotlib.pyplot 的Imshow()顯示不出來... 不知道什麼原因,沒有錯誤...後面遇到這個繪圖的東東還要再多學習呀...
5. Expressing Conditional Logic as ArrayOperations
np.where函數可以表達這種形式的操作:x ifcondition else y比如:
如果採用原始的python表達:
可以發現,不僅會很慢,而且會出錯,另外,還不好用在多維array中;而如果採用np.where:
可以很節省時間和代碼量,並且where的第2,3個參數可以不是array類型;np.where類似於三元操作符()?a:b;
np.where的典型應用是在數據分析中,基於一個array生成一個新的array;如下所示:
可以看到,傳遞至np.where的參數形式多樣;
另外,還可以用np.where表示一個嵌套的判斷,比如:
可以寫成
事實上,根據bool類型的特性,這個式子還可以寫成 result = 1*cond1 + 2*cond2 +3*(not(cond1|cond2)) 。
6. Mathematical and Statistical Methods
np.sum(arr)和arr.sum()等價;
可以用arr.mean(axis=1)來計算指定軸上的統計量;通常2維下,0表示列,1表示行;
其中argmin,argmax表示的是最小值最大值的下標;
cumsum:累加,cumsum(0)表示按列累加(比如第3行第1列的元素爲第1,2,3行,第1列的元素值之和);爲1表示按行累加;
cumprod相同,累乘,初始乘以1;
7. Methods for Boolean Arrays
上述操作的Boolean值通常被置爲1(True)和0(False),sum函數通常可以用來計算True出現的次數;如:
還有兩個有用的函數any和all,any用來判斷array中是否存在True值;all用來判斷array中是否所有值都爲True,如:
這三個函數同樣適用於非Boolean值的array,非零值爲True,零值爲False。
8. Sorting
ndarray中有sort函數,可以對array進行排序,調用方法爲array.sort(axes);當爲一維時,axes可不指定;當爲多維時,如果不傳入axes值,則默認對所有維度上元素進行排序,且重新轉換爲array的shape;當傳入axes值時,可指定排序軸,比如二維情形下,0表示按列排序、1表示按行排序;如:
9. Unique and Other Set Logic
Numpy中有許多基本的1維集合操作函數,最常用的是np.unique,該函數返回排序後的Unique values array;如:
該函數功能等價於純python語言中的sorted(set(names))
函數np.in1d(array,array),測試第一個array中的元素是否在第二個array中,並返回一個boolean array,如:
另外一些函數:如下表所示:
其中setxor1d(x,y)是指元素只在一個array中出現的集合;相當於setdiff1d( union1d(x,y), intersect1d(x,y))
10. File Input and Output with Arrays
Numpy可以讀取或保存數據到磁盤,以文本形式或者二進制形式;
1)以二進制形式將array存儲到磁盤上:
np.save和np.load是二進制保存和讀取數據的函數,在磁盤上的文件後綴名爲.npy格式;如:
還有一個可以保存multiplearrays到一個文件的函數np.savez(filename, *arg,s **kwds),後綴是.npz;如果不指定kwds,則系統會默認爲其賦array名,比如:
可以看到默認的array名爲arr_1,arr_0;可以用=號指定array名,如:
可以根據這個array名字來讀取相應的array,如:
2)以文本形式存儲和讀取數據
簡單的操作:
事實上,np.savetxt()函數有許多參數,如下圖所示:
其中,fmt參數是一些格式化參數,暫時不學習,後面慢慢熟悉。
11. Linear Algebra
Numpy提供一些線性代數的操作函數,比如dot()實現兩個矩陣相乘等,如:
numpy.linalg 模塊包含一系列線性代數操作函數,這個模塊和MATLAB與R一樣,都是採用工業標準Forttran庫實現的。下圖是一些線性代數函數:
其中qr是QR分解,將一個矩陣分解爲一個正交矩陣orthogonal matrix和一個上三角矩陣right triangular matrix;svd是奇異值分解,具體參考線性代數;
12. Random Number Generation
numpy.random是python本身random模塊的擴充,可以有效生成不同概率分佈下的樣本值array;如normal分佈:
Python的內置random模塊僅在一個時間生成一個樣本值,而numpy.random模塊則不是,可以通過下面的實驗看出numpy.random模塊在生成大量樣本值的時候較快;
下表給出了Numpy.random模塊中的一些函數:
其中chisquare是卡方分佈;