1. 程式人生 > >NumPy & pandas

NumPy & pandas

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 pltpandas02.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(“”)