Numpy 是Numerical Python的簡寫,用來進行高效能的科學計算以及資料分析的基礎包。它是一些高階工具(pandas)的基礎。它主要提供以下幾個功能:
(1). ndarray:計算快,空間效率高的多緯的陣列
(2). 快速運算元組的標準數學函式
(3). 向磁碟讀寫資料的工具,提供記憶體影射檔案功能
(3). 線性代數,隨機數生成器,傅立葉變換功能
(4). 整合用C,C++,以及Fortran寫的程式碼的工具 (Python生態系統宗重要的功能)
事實上Numpy本身沒有提供太多資料分析的函式,但是理解NumPy的陣列,以及面向陣列的計算對後期學習pandas等工具有很大的幫助。
1. ndarray , 多維陣列物件
多維陣列物件是NumPy的一個重要特點,它為龐大的資料集提供一個運算快且靈活的容器。
(1). 簡單建立一個陣列,通過呼叫pandas.array(),前提是需要引入numpy包,這裡我門為了方便呼叫,將其重新命名為np
In [6]: import numpy as np In [7]: a = [6,7.5,8,0,1] # 用建立的list物件來建立array物件 In [8]: arr1 = np.array(a) In [9]: arr1 Out[9]: array([ 6. , 7.5, 8. , 0. , 1. ])
(2). 用巢狀序列來建立陣列
n [12]: data2 = [[1, 2, 3, 4], [5, 6, 7, 8]] In [13]: arr2 = np.array(data2) In [14]: arr2 Out[14]: array([[1, 2, 3, 4], [5, 6, 7, 8]])
(3). 除了用np.array 來建立陣列外,還有一些其他的函式來建立新的陣列。
zeros 和 ones 函式可以分別用來建立0,和1 元素的陣列。
In [15]: np.zeros(10) Out[15]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [16]: np.ones((3,5))
Out[16]:
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
通過np.empty 建立一個由任意數初始化的陣列
In [21]: np.empty((2,3,2)) Out[21]: array([[[ 6.91210571e-310, 1.97791711e-316], [ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]], [[ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]]])
通過arrange函式建立:
In [28]: np.arange(10)
Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(4). 檢視陣列屬性
# 檢視陣列維度
In [24]: arr2.ndim Out[24]: 2 # 檢視陣列大尺寸 In [25]: arr2.shape Out[25]: (2, 4) # 檢視陣列元素型別 In [26]: arr2.dtype Out[26]: dtype('int64')
。。。。。
2. ndarrays 的資料型別:
在建立陣列的時候可以指定資料元素的型別,用dtype指定型別,說明在解析陣列所在記憶體空間的時候採用什麼方式。這使得NumPy 更加強大和易用。
在大多數情況下,NumPy是直接型別對映成底層的二進位制,這使得其更容易以二進位制流的方式去讀寫資料。
In [3]: arr1 = np.array([1,2,3,4],dtype = np.float64) In [4]: arr2 = np.array([4,3,2,1],dtype = np.int32) In [5]: arr1.dtype Out[5]: dtype('float64') In [6]: arr2.dtype Out[6]: dtype('int32')
資料型別表:
可以顯示的將一種型別強轉為另一種型別,這時需要使用astye函式
In [7]: arr2.dtype Out[7]: dtype('int32') In [8]: float_arr2 = arr2.astype(np.float64) In [9]: float_arr2 Out[9]: array([ 4., 3., 2., 1.]) In [10]: float_arr2.dtype Out[10]: dtype('float64')
但是當把浮點型別轉化為整形的時候會出現截斷:
In [11]: arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1]) In [12]: arr.astype(np.int32) Out[12]: array([ 3, -1, -2, 0, 12, 10], dtype=int32)
也可以把字串表示的數字轉換為數值型別,但是可能在轉換過程中出錯,因為有的字串無法轉換為數值型別。
In [13]: numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_) In [14]: numeric_strings.astype(float) Out[14]: array([ 1.25, -9.6 , 42. ])
3. 運算
可以在NumPy的陣列之間,以及陣列和數字之間作運算。
In [15]: arr = np.array([[1., 2., 3.], [4., 5., 6.]]) In [16]: arr Out[16]: array([[ 1., 2., 3.], [ 4., 5., 6.]]) # 陣列間乘法 In [17]: arr * arr Out[17]: array([[ 1., 4., 9.], [ 16., 25., 36.]]) # 陣列間減法 In [18]: arr - arr Out[18]: array([[ 0., 0., 0.], [ 0., 0., 0.]]) # 數和陣列的除法 In [19]: 1 / arr Out[19]: array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]) # 數和陣列的乘法 In [20]: arr * 0.5 Out[20]: array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ]])
不同尺寸大小的陣列間也是可以運算的。