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的操作,還可以是 !=,|,&等邏輯操作符(但python的and和or等關鍵字不能作爲操作符),data [-(names=='Bob')]也可以表示除了Bob的其它元素;
data[data<0] =0 可以將data中小於0的元素全部設爲0,很方便。