numpy教程

使用jupyter notebook 分析數據以前導入的包

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中的全部對象都是ndarraypython

每個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每次進行操做的話就是複製很是多的數據。函數

花式索引(fancy indexing)

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 元素級別真值邏輯運算

meshgrid函數

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()

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分佈的樣本值
相關文章
相關標籤/搜索