NumPy & pandas
阿新 • • 發佈:2018-12-09
NumPy
Python科學計算領域,幾乎所有科學計算庫都依賴NumPy
- 強大的N維陣列物件
- 廣播功能
- 基於C語言,速度快
- 線性代數、傅立葉變換和隨機數能力
- numpy.version 查詢版本號
- 檢視陣列中元素型別:nparr.dtype
對比python list(numpy04.py)
- List:對於列表中的每一個元素均需要檢查是哪種具體型別,時間損耗大,但可以修改元素。
- array庫:基於陣列(不能進行矩陣運算),只能儲存單一型別元素
- numpy.array:只儲存單一型別元素,但能進行隱式型別轉換(截位),及進行矩陣操作
- Numpy:arange 對比List:range
- [i for i in range(0,20,0.2)],range引數:1.開始點 2.終止點(不包括) 3.步長,且range中不能傳入浮點數
- np.arange(0,5,0.2) 可以傳入浮點數
- List下直接相乘,只做連線操作:L=[] => 2*L = [0, 1, 2, 3, 0, 1, 2, 3]; numpy下的L可直接看作矩陣,進行矩陣運算:L = np.arange(10) => 2*L=[0, 2, 4, 6]
區分一維向量與二維陣列(矩陣)
- 一維向量:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 只有一個維度,十列一行
- reshape(1,10)後得到二維陣列:array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) 兩個維度,一行十列
基本屬性
- dtype 陣列元素型別:nparr.dtype
- ndim 陣列維度 []的個數:np.arange(15).reshape((3,5))
- shape 返回元組,表示每個維度裡的元素個數:x.shape;shape[0] 讀取矩陣第一維度的長度
- size 元素個數:x.size
資料訪問
- 陣列下標讀取:x[-1]
- 多維讀取(使用元組方式,元組括號可省略):x[(0,0)]
切片操作
- x[0:5] 一維陣列切片,讀取第[0,5)之間
- x[:, 0] 取一列; 逗號左邊為行數,右邊為列數,讀取第0列的所有行,可對矩陣轉置
- x[:2,:3] 多維讀取,逗號前為讀取[0,2)行,逗號後為讀取[0,3)列; 不能使用x[:2][:3] [:3]會取x[:2]得到陣列中的前三個元素
- x[:2, ::2] 列步長為2
資料修改
- subx = x[:2,:3] 通過引用方式獲取子矩陣; 子矩陣、原矩陣互相影響
- x[:2, :3].copy() 建立副本,修改副本值不改變原始陣列值
numpy.array建立方式(numpy05.py)
- 生成元素全為0的:np.aeros(10,dtype=) | np.zeros((3,5), dtype=int),dtype設定datatype,省略預設生成float型別資料
- 生成元素全為1的:np.ones(10)
- 生成其它任意固定數:np.full(shape=, fill_value=,dtype=,order=)
常用函式(numpy01.py)
將資料放在NumPy多維陣列物件中ndarray\numpy.array()
- 匯入:import numpy as np
- 賦值給陣列:np.array([1,2,3,4,5,6])
- 求和、最大值、最小值:np.array().sum()
- 求平均:np.average(np.array())
- N維陣列生成
- 大列表中套N維陣列:np.array([[1, 2, 3], [4, 5, 6]])
- 強制將一維陣列變形成為2行3列二維陣列:example_1d.reshape(2, 3)
常用函式2(numpy06.py)
- arange:np.arange(0,20,0.2) 按步長0.2,在[0,20)範圍內取值
- linspace:np.linspace(0,20,10) [0,20]等長擷取10個點
- random
- 傳入第三個引數生成一個數組(向量):np.random.randint(0, 10, 10)
- 傳入元組,生成對應大小矩陣:np.random.randint(4, 8, size=(3,5))
- big_array = np.random.rand(1000000)
- 通過使用seed每次生成同樣的隨機向量:np.random.seed(600)
- random() 0~1內隨機取值:np.random.random((3,5))
- normal() 取符合正態分佈的浮點數(均值為0,方差為1):np.random.normal() | np.random.normal(10,100)
- 檢視幫助文件
- 僅用於Jupyter:np.random.normal?
- help(np.random.normal)
- reshape 變形
- np.arange(15).reshape(3,5):np.arange()建立一維陣列,.reshape()轉化為二維矩陣形式
- np.arange(10).reshape(10,-1):-1表示根據所給另一資料自動計算值
- 合併操作 concatenate()
- np.concatenate([A, B], axis=0) axis表方向,沿著第二個方向(即列的方向)拼接 ,0:行 1:列
- 不同維度合併(如:A二維矩陣 x一維向量,維數不同不能直接拼接)
- 現將x變形reshape為二維矩陣:np.concatenate([A, x.reshape(1,-1)])
- 簡易方法(vstack\hstack):np.vstack([A,x]) 垂直方向堆疊
- np.tile(v,(2,1)) 向量在行向量上堆疊兩次,列向量上堆疊一次
分割操作split(分割點以陣列形式傳入)
- np.split(x, [3,7]) 根據傳入陣列,按位置分割
- x1, x2, x3 = np.split(x, [3,7])
- 矩陣分割:A1, A2 = np.split(A, [2], axis=1) axis:分割方向,預設以第一個軸(行)分割
- 矩陣分割2(vsplit/hsplit):upper, lower = np.vsplit(A,[2]);應用:樣本與標籤目標值分割;np.hsplit(data, [-1])
- 聚合操作
sum
- sum(L)
- np.sum(L)
- big_array.sum()
- np.sum(X,axis=0):沿著行方向壓縮,逐列計算; np.sum(X,axis=1):逐行計算
- min/max
- np.min(big_array); np.max(big_array)
- big_array.min(); big_array.max()
- prod求元素乘積(python支援大數運算):np.prod(X+1)
- mean平均值:np.mean(X)
- 中位數:np.median(X)
- 百分位:np.percentile(big_array,q=50) big_array中50%的資料小於等於?;一般通過[0,25,50,75,100]五個百分位點看資料分佈
- 方差:np.var(big_array)
- 標準差:np.std(big_array)
- 索引:np.argmin(x); np.argmax(x)
- 亂序處理shuffle:np.random.shuffle(x) 改變原陣列
排序
- np.sort(x) 預設從小到大;np.argsort(x) 按照排序前陣列找到對應位置
- np.partition(x,3) 快排:3為標定點; np.argpartition(X, 2, axis=1)
- X.sort() 改變原始值; np.sort(X,axis=1) 不改變原始值,按照每一行排序(沿著列),預設axis=1
廣播
- 陣列+常數:np.array([[1, 2, 3], [4, 5, 6]]) + 3 == np.array([[1, 2, 3], [4, 5, 6]]) + np.array([[3, 3, 3], [3, 3, 3]]) 廣播將數字擴充套件到陣列中的每一個元素中
- 陣列常數:np.array([[1, 2, 3], [4, 5, 6]]) 3
- 變為以e為底的指數:np.exp(A)
- 矩陣乘法(左行右列):np.dot(A, B) | A.dot(B)
向量化計算
- 最大程度不使用for迴圈:底層使用python
- 儘量使用NumPy自帶函式:底層使用c
- 多使用廣播
Universal Function(numpy06.py)
x = np.arange(1,16).reshape((3,5))* x + 1; x / 2; x // 2; 1 / x
- np.abs(x); np.sin(x); np.log2(x); np.exp(x); np.power(3,x) 相當於 3**x
- 矩陣乘法(左行右列):A.dot(B); np.dot(A, B); v.dot(A) 對於一個向量和矩陣乘法,Numpy自動判斷向量取行向量還是列向量 自動將v轉化為相應矩陣
- 矩陣轉置:A.T
Fancy Indexing(numpy08.py)
- [x[3], x[5], x[8]]
- ind = [3,5,8]; x[ind]; ind = np.array([[0,2],[1,3]]); x[ind]
- row = np.array([0, 1, 2]); col = np.array([1, 2, 3]); X[row, col]; 對應三個點(0,1)(1,2)(2,3)
*
numpy.array比較
- 2 * x == 24 - 4 * x
- np.sum(x <= 3)
- np.count_nonzero(x <= 3)
- np.any(x == 0) x中有任意一個等於0, 即返回true
- np.all(x < 0) x中每一個元素x < 0時為true,則結果返回true,否則返回false
- np.sum(X % 2 == 0, axis=1)
- np.all(X > 0, axis=1)
- np.sum((x > 3) & (x < 10)); np.sum((x % 2 == 0) | (x > 10)); 兩個陣列,按照索引,分別進行與或運算,故用位運算子&
- np.sum(~(x==0))
- x[x < 5] bool陣列作為索引陣列
- X[X[:,3] % 3 == 0, :] 將所有行第三列的值抽出來,選擇%3==0的作為行,取所有列
矩陣運算(numpy09.py)
- List下直接相乘,只做連線操作:L=[]; => 2*L = [0, 1, 2, 3, 0, 1, 2, 3]
- 使用for迴圈實現矩陣運算:for e in L: A.append(2*e)
- 使用行內運算:A = np.array([2*e for e in L])
- numpy下的L可直接看作矩陣,進行矩陣運算:L = np.arange(10) => 2*L=[0, 2, 4, 6]
- 向量和矩陣的運算:向量和矩陣每一行相應位置做加法,v+A; 對應位置相乘,v*A
- 堆疊成矩陣:np.vstack([v] * A.shape[0]) + A; np.tile(v,(2,1)) 向量在行向量上堆疊兩次,列向量上堆疊一次
- 矩陣的逆AA^(-1)=E: np.linalg.inv(A); 偽逆矩陣:np.linalg.pinv(X)
邏輯迴歸:dw = 1 / m * np.dot(X, (A-Y).T) .T求轉置
邏輯迴歸損失函式:
pandas
資料分析和計算的第三方庫,為python提供了高效能、易使用的資料計算功能
讀取資料
- 一:讀取列表中的字典 data=[{},{}]; pd.DataFrame(data)
- 二:讀取CSV檔案 pd.read_csv(‘檔案路徑’) 返回DataFrame物件
- 三:讀取sql import sqlite3
常用函式:選擇資料
- 選擇某列:df1[‘age’]
- 按條件選擇:df1[df1[‘age’] < 100] 、 df1[df1[‘age’] % 2 == 0]
常用函式:去重
- 一:去重,返回陣列 df4[‘name’].unique()
- 二:按照name去重,保留第一項,返回DataFrame型別 df4.drop_duplicates(‘name’, keep=’first’)
- 三:保留最後一項 df4.drop_duplicates(‘name’, keep=’last’)
常用函式:GroupBy分組 (與MySQL中效果一致)
- df5.groupby(‘sex’).size()
- df5.groupby(‘sex’).size().reset_index(name=’size’) 將得到的結果重新變成DataFrame物件
- 求和:查詢dataFrame中可以進行求和的內容(age) df5.groupby(‘sex’).sum()
- 求最大值、最小值:df5.groupby(‘sex’).max() 、 .min()* 求平均值:df5.groupby(‘sex’).mean()
畫圖:import matplotlib.pyplot as plt (pandas02.py)
- 在使用jupyter notebook 或者 jupyter qtconsole時,使用%matplotlib inline
- %matplotlib:當呼叫matplotlib.pyplot的繪圖函式plot()進行繪圖,或者生成一個figure畫布,可以直接在console裡面生成影象
- plt.plot(x=’name’, y=’age’) 生成影象的x\y軸座標項
- 生成影象:plt.show()
- 散點圖:plt.scatter(x, y, alpha=0.5); alpha不透明度
- plt.scatter(X[y==0, 0], X[y==0, 1], color=”red”, marker=”o”)
- plt.axis([-1, 11, -2, 2])
- plt.xlabel(“x axis”)
- plt.legend()
- plt.title(“”)