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

1. numpy庫是幾乎本書所有更高級工具的基礎。它主要提供:

※ ndarray,速度快且空間高效的多維array,可進行向量化算術操作和更高級推廣應用能力;

※ 標準數學函數,可快速執行整個array上的數據操作,而不需要寫循環;

※ 讀寫硬盤數據的工具,以內存映射(memory-mapped)方式工作;

※ 線性代數,隨機數生成,傅里葉變換功能;

※ 整合C++,C, Fortran代碼功能;

 

NumPy本身並不提供高層次的數據分析功能,但是掌握NumPy arrays和麪向array的操作可以幫助你高效的使用pandas這些工具。

 

2. ndarray(n-dimensional array object):多維array對象,可以很方便的存儲、操作大量數據。

ndarray和python中的array不同,比如說操作符號*,+;python中array*10會返回10倍長度的array,相當於array中的內容重複10次,array+array相當於2倍長度。而numpy中的array*10會將array的內容全部乘以10,相當於10乘以這個array矩陣;array+array是兩個array中的內容相加。可以定義一個python的array,然後用np.array()轉化。另外,numpy中的array元素如果有一個是浮點數,那麼這個array中的所有元素都會以浮點數存儲。

 

data.shape: 返回data的維數;

data.dtype: 返回data的元素類型;

data.ndim:返回行數;

np.zeros():創建元素都爲0的array,array的維數等於括號內賦給的維數;

np.ones():遇上一個類似,創建元素都爲1的array,array的維數等於括號內賦給的維數shape;

np.empty():創建一個array,裏面的所有元素都沒有被初始化;

np.arange():類似於python中的range()函數,但是是以np.array形式返回的;


下面是ndarray的一些創建函數:


裏面的ones_like,zeros_like,empty_like函數中的參數可以是其他array,這樣會創建一個和其他array shape相同的ndarray。asarray將input轉換爲ndarray,如果Input已經是ndarray的話,不用複製。


3. Dtype

Dtype是使得NumPy變得強大的基礎之一,在大多數情況下,Dtype可以直接將類型轉換成機器表示,可以二進制方式讀寫硬盤來與底層語言C或Fortran連接。Python中的數字類型的解釋如下圖所示:



可以使用astype()函數將一個array的類型轉換爲另一種類型,如:

arr =np.array([1,2,3,4,5])

float_arr =arr.astype(np.float64)

而當將浮點型轉換爲整型時,小數點後的部分會被截掉;


另外,也可以用string類型保存數字,再將string轉換成數字類型,如:

numeric_strings =np.array(['1.25', '-9.6', '42'], dtype=np.string_)

numeric_strings.astype(float)

即可將string類型存儲的數字轉換爲數字類型,但是好像numeric_strings本身的類型並不改變,只改變顯示的類型,如果需要本身的類型改變可能要重新賦值。注意np.string_是string類型的表達;當字符串類型不能轉換爲float類型時,會報出TypeError錯誤;

在用astype時還可以用其他array的type,比如string_arr =arr.type(numeric_strings.dtype)

 

當然,也可以用上述的TypeCode來代替指定的類型;


4. numpy的vectorization

arrays很重要因爲它提供了可以批處理數據而不需要寫任何for循環;這叫做vectorization

比如說arr = np.array([[1.,2.,3.],[4.,5.,6.]]),可以進行arr * arr,arr ** 0.5,1/arr等運算,這些運算都是對array中的元素做相應的計算,即向量化的操作;

 

5. Basic indexing and slicing

Numpy中的下標和切片操作很豐富,它在一維上的操作類似於python,但也有些許不同;如:

arr =np.arange(10)

arr[5:8] = 12     # array([0,1,2,3,4,12,12,12,8,9])

arr_slice =arr[5:8]

arr_slice[1] =12345  #arr =array([0,1,2,3,4,12345,12,12,8,9])

可以看出兩點:1)對切片可以按下標去讀取和修改;2)當取出切片並對該切片進行修改時,修改的結果會反應在原array中;

所以如果是希望將原array中的數據拷貝出來操作時,需顯式的給出.copy(),如

arr_slice2 =arr[5:8].copy()

 

對於N維數據而言,它相當於第一維[0]爲N-1維數據,第[0][0]爲N-2維數據,...,依次類推,當然也可以採用下標和slice等操作;如:

arr2d =np.array([[1,2,3],[4,5,6],[7,8,9]])

arr2d[1]  # array([4,5,6])

arr2d[1][1]   # 5

arr2d[1,1]   # 5

可以看到最後兩句結果是等同的,其實在numpy中訪問下標可以寫成這種逗號形式,它與兩個中括號的表達相同;同樣,在arr中的修改會反應在原始array中;在N維數據上的切片操作會在按維度數相應的反應出來;且多維的切片操作要在一箇中括號裏表示如arr2d[1,:2]

 

6. Boolean indexing

(注意:調用randn函數時,要用np.random.randn()來調用,否則會出現'module' object is not callable的錯誤)

比如說我們想判斷一個string array中的元素是否等於'Bob',可以用==來實現,如:


然後,其實得到的這個Boolean類型的array是可以作爲參數傳遞給其他array的,比如:




但是要注意這個boolean array的長度一定要與所要傳進的array行的長度相同;boolean array實際上就是一個劃分參數罷了,在data的其它維度上仍然可以進行slice,如

data[names=='Bob',2:]

 

boolean的操作,還可以是 !=|&等邏輯操作符(但pythonandor等關鍵字不能作爲操作符),data [-(names=='Bob')]也可以表示除了Bob的其它元素;

 

data[data<0] =0 可以將data中小於0的元素全部設爲0,很方便。



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