《python for data analysis》筆記三--Numpy基礎:arrays和向量化計算2

繼續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.savenp.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是卡方分佈;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章