1. 程式人生 > >《python for data analysis》筆記三--Numpy基礎:arrays和向量化計算2

《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是卡方分佈;