Numpy(Numerical Python的簡稱)是高性能科學計算和數據分析的基礎包。python
主要的功能:數組
一、ndarray,一個具備矢量運算和複雜廣播工能的快速且節省空間的多維數組less
二、用於對整組數據進行快速運算的標準數據函數(無需編寫循環)ide
三、用於讀寫磁盤數據的工具以及用於操做內存映射文件的工具函數
四、線性代數、隨機數生成以及傅里葉變換功能工具
五、用於集成由C、C++、Fortran等語言編寫的代碼的工具性能
1、Numpy的ndarray:一種多維數組對象、大數據
numpy最重要的特色:ui
一、其N維數組對象(ndarray)spa
二、是一個快速靈活的大數據容器
三、能夠利用這種數組對整塊數據進行數學運算,其語法和標量元素之間的運算同樣
四、ndarray中的全部元素必須是相同類型的。每一個數組都有一個shape(表示各維度大小的元祖)和dtype(說明數組數據的對象)
1.1 ndarray的建立
1 import numpy as np 2 3 data = [1,2,3,4] 4 ''' 5 array([1, 2, 3, 4]) 6 ''' 7 arr = np.array(data) 8 9 #1 10 arr.ndim # 數組維度 11 12 #(4,) 13 arr.shape # 數組各維度大小的元祖
1 import numpy as np 2 3 #額外能建立ndarray的方法 4 5 np.zeros(10) # 建立指定長度形狀的數組, 全0 6 np.zeros((3,2)) 7 np.zeros((1,2,3)) 8 9 np.ones() # 建立指定長度形狀的數組, 全1 10 11 np.empty((2,3,2)) # 建立沒有任何具體值的數組
1.2 ndarray的數據類型
Numpy的數據類型
類型 | 說明 |
int八、uint8 | 有符號和無符號的8位(一個字節)整型 |
int1六、uint16 | 有符號和無符號的16位(兩個個字節)整型 |
int3二、uint32 | 有符號和無符號的32位(三個字節)整型 |
int6四、uint64 | 有符號和無符號的64位(四個字節)整型 |
float16 | 半精度浮點數 |
float32 | 標準的單精度浮點數。與C的float兼容 |
float64 | 標準的雙精度浮點數。與C的double和Python的float對象兼容 |
float128 | 擴展精度浮點數 |
complex6四、complex128 | 分別用兩個32位 、64位或128位浮點數表示的複數 |
bool | 存儲Ture和Flase值的布爾類型 |
object | Python對象類型 |
String_ | 固定長度的字符串類型 |
Unicode_ | 固定長度的Unicode類型(字節數由平臺決定) |
dtype是一個特殊的對象,它含有ndarray將一塊內存解釋爲特定數據類型所需的信息。
1 import numpy as np 2 3 arr = np.array([1,2,3], dtype=np.float64) 4 arr.dtype 5 6 arr.astype(np.float32) # 轉換爲dtype
2、數組和標量之間的運算
大小相等的數組之間的任何算術運算都會將運算應用到元素級別
1 import numpy as np 2 3 arr1 = np.array([[1,2,3],[3,4,5]]) 4 arr2 = np.array([[6,7,8],[9,10,11]]) 5 6 ''' 7 array([[ 7, 9, 11], 8 [12, 14, 16]]) 9 ''' 10 arr1 + arr2 11 12 13 ''' 14 array([[-5, -5, -5], 15 [-6, -6, -6]]) 16 ''' 17 arr1 - arr2 18 19 ''' 20 array([[ 6, 14, 24], 21 [27, 40, 55]]) 22 ''' 23 arr1 * arr2 24 25 ''' 26 array([[ 0.16666667, 0.28571429, 0.375 ], 27 [ 0.33333333, 0.4 , 0.45454545]]) 28 ''' 29 arr1 / arr2
不一樣大小的數組之間的運算叫作廣播(broadcasting)會在後面的內容中單獨講,自己是一個很是重要的概念
3、基本的索引和切片
一維數組的索引和切片和Python列表的功能差很少,這裏只作簡單的舉例,不作更多說明。
區別的地方須要單獨說明:一、在numpy的數組中,若是你將一個標量值賦值給一個切片時,例如arr[3:4] = 8,該值就會自動賦值給這個切片選區中,即(3,4]位置上的值都變成8;二、numpy中數組的切片時原始數組的視圖,數據不會被複制,視圖上的任何修改都會直接反應到原數組上。
1 import numpy as np 2 3 arr = np.array([1,2,3,4,5,6]) 4 5 arr[2,4] = 44 6 7 ''' 8 array([1,2,44,44,5,6]) 9 ''' 10 print(arr)
二維數組中,各個索引位置上的元素再也不是標量而是一維數組,依次類推多維也是這樣
import numpy as np arr2d = np.array([[1,2,3],[2,3,4],[3,4,5]]) ''' array([3,4,5]) ''' arr2d[2] arr2d[0][2] # 等價於 arr2d[0,2]
二維數組的索引方式:縱軸表示 axis0,橫軸表示axis1
ndarray的切片語法跟Python列表這樣的一維對象差很少,在多維度上也是同樣的,可是咱們須要記住各個索引位置的元素再也不是標量二維一維數組
1 import numpty as np 2 3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]]) 4 5 ''' 6 array([[1,2,3],[2,3,4]]) 7 ''' 8 arr[:2]
1 import numpty as np 2 3 arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]]) 4 5 ''' 6 array([[1],[2]]) 7 ''' 8 arr[:2,:,1]
4、布爾型索引
能夠對ndarray中的數據作布爾類型的判斷截取
1 import numpy as np 2 3 arr = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]]) 4 5 ''' 6 array([4, 5, 4, 5, 6, 4, 5, 6, 7]) 7 ''' 8 arr[arr > 3] 9 10 ''' 11 array([3, 3, 3]) 12 ''' 13 arr[arr == 3] 14 15 ''' 16 array([1, 2, 2]) 17 ''' 18 arr[arr < 3]
5、花式索引
花式索引(Fancy indexing)是一個Numpy術語,它指的是利用整數數組進行索引。
爲了以特定順序選取行子集,只須要傳入一個用於指定順序的整數列表或者ndarray,如下爲例子:
1 import numpy as np 2 3 ''' 4 array([[ 0., 0., 0., 0.], 5 [ 1., 1., 1., 1.], 6 [ 2., 2., 2., 2.], 7 [ 3., 3., 3., 3.], 8 [ 4., 4., 4., 4.], 9 [ 5., 5., 5., 5.], 10 [ 6., 6., 6., 6.], 11 [ 7., 7., 7., 7.]]) 12 ''' 13 arr 14 15 ''' 16 array([[ 4., 4., 4., 4.], 17 [ 3., 3., 3., 3.], 18 [ 0., 0., 0., 0.], 19 [ 6., 6., 6., 6.]]) 20 ''' 21 arrr[[4,3,0,6]] # 傳入了指定順序的整數列,4,3,0,6是順序 22 23 arr[[-1,-2,-5]] # 負數從尾部開始取,順序
一次傳入多個索引數組的狀況,如下爲實例:
1 import numpy as np 2 3 ''' 4 array([[ 0, 1, 2, 3], 5 [ 4, 5, 6, 7], 6 [ 8, 9, 10, 11], 7 [12, 13, 14, 15], 8 [16, 17, 18, 19], 9 [20, 21, 22, 23], 10 [24, 25, 26, 27], 11 [28, 29, 30, 31]]) 12 ''' 13 arr = np.arange(32).reshape((8,4)) 14 15 ''' 16 array([4,23,29,10]) 17 ''' 18 arr[[1,5,7,2],[0,3,1,2]] #最終取出的數據是 座標(1,0)(5,3)(7,1)(2,2) 19 20 ''' 21 array([[ 4, 7, 5, 6], 22 [20, 23, 21, 22], 23 [28, 31, 29, 30], 24 [ 8, 11, 9, 10]]) 25 ''' 26 arr[[1,5,7,2]][:,[0,3,1,2]] # 獲取矩形區域 27 28 ''' 29 np.ix() 將兩個一維整數數組轉換爲一個用於選取方形區域的索引器 30 ''' 31 arr[np.ix([1,5,7,2],[0,3,1,2])] # 獲得和上面同樣的結果
6、經常使用一元函數
函數 | 說明 |
abs、fabs | 計算整數、浮點數或複數的絕對值。對於非複數值,可使用更快的fabs |
sqrt | 計算各元素的平方根。至關於arr**0.5 |
square | 計算各元素的平方。至關於arr**2 |
exp | 計算各元素的指數 |
log log10 log2 log1p | 分別爲天然對數(底數爲e)、底數爲10的log、底數爲2的log 、 log(1+x) |
sign | 計算各元素的正負號:1正數,0零,-1負數 |
ceil | 計算各元素的ceiling值,即大於等於該值的最小整數 |
floor | 計算各元素的floor值,即小於等於該值的最大整數 |
rint | 將各元素值四捨五入到最接近的整數,保留dtype |
modf | 將數組的小數和整數部分以兩個獨立數組的形式返回 |
isnan | 返回一個表示NAN的布爾型數組 |
isfinite isinf | 分別返回一個表示,那些元素是有窮的 或者 哪些元素是無窮的 布爾類型數組 |
cos cosh sin sinh | 普通型和雙曲型三角函數 |
arccos arccosh arcsin arcsinh arctan arctanh |
反三角函數 |
logical_not | 計算各元素not x的真值。至關於-arr |
7、二元經常使用函數
函數 | 說明 |
add | 將數組中對應的元素相加 |
subtract | 從第一個數組中減去第二個數組中的元素 |
multiply | 數組元素相乘 |
divide、floor_divide | 除法或向下圓除法 |
power | 對第一個數組中的元素A,根據第二個數組中的相應元素B,計算AB |
maximum、fmax | 計算元素級的最大值 fmax將忽略NaN |
minimum、fmin | 計算元素級的最小值計算 fmin將忽略NaN |
mod | 元素級的求模計算(除法的餘數) |
copysign | 將第二個數組中的值的符號複製給第一個數組中的值 |
greater、greater_equal less、less_equal equal、not_equal |
執行元素級的比較運算,最終產生布爾型數組。至關於> >= <= < == != |
logical_and logical_or logical_xor |
執行元素級的真值邏輯運算。至關於& | ^ |
8、基本數組統計方法
方法 | 說明 |
sum | 對數組中所有或某軸向的元素求和。零長度的數組和sum爲0 |
mean | 算術平均數。零長度的數組的mean爲NAN |
std、var | 分別爲標準差和方差,自由度可調(默認爲n) |
min、max | 最大值和最小值 |
argmin、argmax | 分別爲最大和最小元素的索引 |
cumsum | 全部元素的累計和 |
comprod | 全部元素的累計積 |
做爲布爾類型數組的方法
arr.any() 數組中是否存在一個或多個True
arr.all() 數組中是否全部的值都爲True
排序:arr.sort() 返回排序後的數組
9、數組的集合運算
方法 | 說明 |
unique(x) | 計算x中的惟一元素,並返回有序結果 |
intersect1d(x,y) | 計算x和y中的公共元素,並返回有序結果 |
union1d(x,y) | 計算x和y的並集,並返回有序結果 |
in1d(x,y) | 獲得一個表示‘x的元素是包含於y’的布爾數組 |
setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
setxor1d(x,y) | 集合的對稱差,即存在於一個數組中單不一樣時存在於兩個數組中的元素 |
內容參考自《利用Python進行數據分析》