import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) %matplotlib inline import matplotlib.pyplot as plt # Matlab-style plotting import seaborn as sns color = sns.color_palette() sns.set_style('darkgrid') import warnings def ignore_warn(*args, **kwargs): pass warnings.warn = ignore_warn #ignore annoying warning (from sklearn and seaborn)
在numpy
的使用過程當中,最重要的概念就是ndarray
,實質上就是數組,在numpy
中的全部對象都是ndarray
python
每個ndarray對象都有一個shape和dtype屬性,用於存儲數組的形狀和數據類型數組
函數 | 說明 |
---|---|
array | 將輸入的數據轉換爲ndarray |
asarray | 將輸入轉換爲ndarray |
arange | range的數組版本 |
ones、ones_like | 根據指定的形狀建立一個全1的數組,ones_like以另外一個數組爲參數,建立一個與該數組大小相同的全爲1的數組 |
zero、zeros_like | 與ones和ones_like相似 |
empty、empty_like | 建立一個沒有賦予初始值的數組,用法與ones和ones_like相似 |
eye,identity | 建立一個單位矩陣 |
能夠經過ndarray的astype方法將數組的數據類型轉換爲其餘類型less
*:直接用乘號或者除號,表示數組元素之間直接相乘,這個操做稱之爲廣播(不一樣大小數組之間的運算)dom
np.dot(x,y)或x.dot(y):用於矩陣乘積ide
In [1]: arr = np.arange(10) In [2]: arr Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [3]: arr[5:8] = 12 In [4]: arr Out[4]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9]) In [5]: arr_slice = arr[5:8] In [6]: arr_slice[1] = 12345 In [7]: arr Out[7]: array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])
numpy當中全部數據切片賦值時都是沒有進行復制的,視圖上的任何修改都會直接反映到原數組上,由於numpy通常處理很是大的數據集,若是numpy每次進行操做的話就是複製很是多的數據。函數
In [1]: arr = np.arange(32).reshape((8,4)) In [2]: arr Out[2]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]]) In [3]: arr[[-1,1,3]] Out[3]: array([[28, 29, 30, 31], [ 4, 5, 6, 7], [12, 13, 14, 15]]) In [4]: arr[[1,2,3,-1],[3,2,1,0]] Out[4]: array([ 7, 10, 13, 28])
同時傳入多個索引,一次索引出多個值測試
arr.T表示arr的轉置,或者transpose方法表示轉置spa
tanspose有一個換維度的操做code
In [4]: arr = np.arange(16).reshape((2,2,4)) In [5]: arr Out[5]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) In [6]: arr.transpose((1,0,2)) Out[6]: array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]]) 簡而言之就是將原來的0,1,2軸變成如今的1,0,2,轉換後的0軸是原來的1軸,轉換後的1軸是原來的0軸,2軸未變。 換種解釋:好比說8元素的索引是[1,0,0],0,1軸變換後是[0,1,0]。
(ufunc):快速的元素級數組函數對象
函數 | 說明 |
---|---|
abs,fabs | 計算絕對值,對於非複數,可使用更快的fabs |
sqrt | 計算元素的平方根,至關於arr**0.5 |
square | 計算各元素平,至關於arr**2 |
log,log10,log2,log1p | 計算天然對數,以10位底的對數,底數爲2的對數,以及log(1+x) |
sign | 取元素的符號,1正,0零,-1負 |
ceil | 向上取整 |
向下取整 | |
四捨五入取整 | |
將數組的小數和整數部分分別用兩個數組返回 | |
isfinite,isinf | 返回哪些元素是有窮的,哪些元素是無窮的布爾型數組 |
cos,cosh,sin,sinh,tan,tanh | 三角函數 |
logical_not | 計算各元素not x的真值,至關於-arr |
二元ufunc
函數 | 說明 |
---|---|
add | 將數組對應元素相加 |
subtract | 對應元素相減 |
multiply | 對應元素相乘 |
divide,floor_divide | 除法或丟掉餘數的整除法 |
pow | 計算\(A^B\) |
maximum, fmax | 元素級的最大值計算,fmax忽略nana |
minimum,fmin | 最小值計算 |
mod | 求模運算 |
copysign | 將B數組的符號複製給第一個數組 |
greater,greater_equal,less,less_equal,equal, not_equal | 元素比較 |
logical_and, logical_or,logical_xor | 元素級別真值邏輯運算 |
X,Y = np.meshgrid(a,b)
獲得X爲a做爲行向量,擴展b.shape那麼多行,Y是以b爲列向量,擴展a.shape那麼多列
In [67]: xnums Out[67]: array([0,1, 2, 3]) In [68]: ynums Out[68]: array([0,1, 2, 3, 4]) In [69]: data_list= np.meshgrid(xnums,ynums) In [70]: data_list Out[70]: [array([[0, 1, 2,3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]), array([[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]])]
np.where能夠進行x if condition else y
的快捷形式
好比咱們在下面的例子中,將全部正數替換爲2,負數替換爲1
In [7]: arr = np.random.randn(4,4) In [8]: arr Out[8]: array([[ 0.67616266, -0.05338506, 1.24429511, -0.01608611], [ 1.19887484, -0.26227917, -1.06689128, 1.6256341 ], [ 1.33528028, -0.56730727, 0.00761954, 0.15508178], [-1.4552253 , 0.12884633, 0.63242436, -0.62763473]]) In [9]: np.where(arr>0, 2, 1) Out[9]: array([[2, 1, 2, 1], [2, 1, 1, 2], [2, 1, 2, 2], [1, 2, 2, 1]])
sum求和,mean均值,std標準差,var方差,min,max最小最大值
argmin,argmax最小最大值的索引
cumsum:全部元素的累積和,和search_sorted方法配合能夠算出分位數所在的位置
In [10]: arr = np.random.randn(1000) In [11]: arr.sort() In [12]: arr.searchsorted(int(0.05*(max(arr)-min(arr)))) Out[12]: 458
cumprod:全部元素的累積積
np.unique
效果與python中的set對於list的效果同樣,只保留不相同的值
np.in1d
用於測試參數是否在數組中
In [13]: arr = np.arange(6) In [14]: arr Out[14]: array([0, 1, 2, 3, 4, 5]) In [15]: np.in1d(arr,[0,3,4]) Out[15]: array([ True, False, False, True, True, False], dtype=bool)
函數 | 說明 |
---|---|
unique | 返回惟一元素的有序結果 |
intersect1d(x,y) | 交集(計算xy的公共元素並返回有序結果) |
union | 並集 |
in1d(x,y) | y是否存在於x中的布爾數組 |
setdiff1d | 差集 |
setxor1d | 對稱差,存在於一個數組中但不一樣時存在於兩個書注重的元素 |
np.save('filename', arr)
:若是沒有加後綴會自動加上.npy,而後可使用np.load讀取這個array
np.savez('filename', a=arr1, b=arr2)
:存儲到壓縮文件,後綴爲.npz,讀取時用load,而後經過字典key,value的索引方式分別取出a和b
np.loadtxt('array.txt',delimiter=',')
:讀取txt文件,指定分隔符號爲delimiter
np.savetxt('filename', arr)
:保存爲txt文件
函數 | 說明 |
---|---|
diag | 返回方陣的對角線元素,或者把一維數組轉化爲方陣 |
dot | 矩陣乘法 |
trace | 對角線元素和 |
det | 矩陣行列式 |
eig | 計算方陣的特徵值和特徵向量 |
inv | 求方陣的逆 |
pinv | 僞逆 |
計算QR分解值 | |
svd | 奇異值分解 |
解線性方程Ax=b,其中A是一個矩陣 | |
計算Ax=b的最小二乘解 |
函數 | 說明 |
---|---|
seed | 肯定隨機數生成器的種子 |
permutation | 返回一個序列的隨機排列或者一個隨機排列的範圍 |
shuffle | 隨機打亂一個序列 |
rand | 產生均勻隨機分佈的樣本值 |
randint | 從給定的上下範圍內隨機選取整數 |
randn | 產生正態分佈(平均值爲0,標準差爲1)的樣本值 |
產生二項分佈的樣本值 | |
產生正態分佈的樣本值 | |
產生beta分佈的樣本值 |