【MOOC】Python資料分析與展示-北京理工大學-【第一週】資料分析之表示
單元一:NumPy庫入門
1.1 資料的維度
維度:一組資料的組織形式
一維資料
一維資料由對等關係的有序或無序資料構成,採用線性方式組織,對應列表、陣列和集合等概念
如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。
其中,關於列表和陣列的區別是:
二維資料
二維資料由多個一維資料構成,是一維資料的組合形式,表格是典型的二維資料,其中,表頭是二維資料的一部分。
多維資料
多維資料由一維或二維資料在新維度上擴充套件形成
高維資料
高維資料僅利用最基本的二元關係展示資料間的複雜結構
資料維度的Python表示
1.2 NumPy的陣列物件:ndarray
NumPy是一個開源的Python科學計算基礎庫,包含:
• 一個強大的N維陣列物件 ndarray
• 廣播功能函式
• 整合C/C++/Fortran程式碼的工具
• 線性代數、傅立葉變換、隨機數生成等功能
NumPy是SciPy、 Pandas等資料處理或科學計算庫的基礎
我們一般使用 import numpy as np
來引用numpy庫
ndarray 意為:N維陣列物件
這裡自然就有一個疑問:Python已有列表型別,為什麼需要一個數組物件(型別)?看下面的例子:
那麼,引入ndarray 的好處就是:
• 陣列物件可以去掉元素間運算所需的迴圈,使一維向量更像單個數據
• 設定專門的陣列物件,經過優化,可以提升這類應用的運算速度
注:科學計算中,一個維度所有資料的型別往往相同
• 陣列物件採用相同的資料型別,有助於節省運算和儲存空間
ndarray由兩部分構成:
• 實際的資料
• 描述這些資料的元資料(資料維度、資料型別等)
ndarray陣列一般要求所有元素型別相同(同質),陣列下標從0開始
例項:
ndarray物件的屬性
例項:
1.3 ndarray陣列的元素型別
疑問:ndarray為什麼要支援這麼多種元素型別?
對比:Python語法僅支援整數、浮點數和複數3種類型
• 科學計算涉及資料較多,對儲存和效能都有較高要求
• 對元素型別精細定義,有助於NumPy合理使用儲存空間並優化效能
• 對元素型別精細定義,有助於程式設計師對程式規模有合理評估
非同質的ndarray物件
1.4 ndarray陣列的建立
ndarray陣列的建立方法
• 從Python中的列表、元組等型別建立ndarray陣列
• 使用NumPy中函式建立ndarray陣列,如:arange, ones, zeros等
• 從位元組流(raw bytes)中建立ndarray陣列
• 從檔案中讀取特定格式,建立ndarray陣列
(1) 從Python中的列表、元組等型別建立ndarray陣列
使用方法:
例項:
(2)使用NumPy中函式建立ndarray陣列,如:arange, ones, zeros等
函式用法1:
注意:shape這個引數應是 元組 型別
例項:
函式用法2:
(3)使用NumPy中其他函式建立ndarray陣列
函式用法:
例項:
1.5 ndarray陣列的變換
對於建立後的ndarray陣列,可以對其進行維度變換和元素型別變換
維度變換:
注意:這裡有些函式呼叫後會修改原陣列,有些則不會。
例項:
例項2:
元素型別變換:
ndarray陣列向列表的轉換
1.6 ndarray陣列的操作
陣列的索引和切片
索引:獲取陣列中特定位置元素的過程
切片:獲取陣列元素子集的過程
一維陣列的索引和切片:與Python的列表類似
多維陣列的索引:
多維陣列的切片
1.7 ndarray陣列的運算
陣列與標量之間的運算作用於陣列的每一個元素
NumPy一元函式:對ndarray中的資料執行元素級運算的函式
例項:
NumPy二元函式
例項:
單元小結
單元二:Numpy資料存取與函式
2.1 資料的CSV存取
CSV (Comma‐Separated Value, 逗號分隔值),CSV是一種常見的檔案格式,用來儲存批量資料
savetxt: 存CSV檔案
例項1:
例項2:
loadtxt: 讀CSV檔案
注:dtype一般預設為 浮點 型別
例項:
CSV檔案的侷限性
CSV只能有效儲存一維和二維陣列
np.savetxt() np.loadtxt()只能有效存取一維和二維陣列
2.2 多維資料的存取
使用tofile函式儲存多維資料
例項1:
例項2:
使用fromfile函式讀取多維資料
例項:
注意:該方法需要讀取時知道存入檔案時陣列的維度和元素型別,a.tofile()和np.fromfile()需要配合使用,可以通過元資料檔案來儲存額外資訊
NumPy便捷檔案的讀取
例項:
2.3 NumPy的隨機數函式
NumPy的隨機函式子庫:np.random.* 包含有關隨機數的函式
例項:
注意函式是否改變原陣列
例項:
2.4 NumPy的統計函式
例項:
例項:
注:argmax/argmin經常與unravel_index結合使用—->得到多維陣列中最大/小資料的多維陣列下標
2.5 NumPy的梯度函式
單元小結
單元三:例項1-影象的手繪效果
3.1 影象的資料表示
影象一般使用RGB色彩模式,即每個畫素點的顏色由紅(R)、綠(G)、藍(B)組成。
RGB三個顏色通道的變化和疊加得到各種顏色,其中
• R 紅色,取值範圍,0‐255
• G 綠色,取值範圍,0‐255
• B 藍色,取值範圍,0‐255
RGB形成的顏色包括了人類視力所能感知的所有顏色
PIL庫
注:影象是一個三維陣列,維度分別是高度、寬度和畫素RGB值
3.2影象的變換
變換原理:讀入影象後,獲得畫素RGB值,修改後儲存為新的檔案
例項:
3.3 -影象的手繪效果例項分析
效果分析:
程式碼:
#HandDrawPic.py
# -*- coding: utf-8 -*-
from PIL import Image
import numpy as np
a = np.asarray(Image.open('./beijing.jpg').convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) #取影象灰度的梯度值
grad_x, grad_y = grad #分別取橫縱影象梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)#這裡相當於 grad_z=1.0
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
vec_el = np.pi/2.2 # 光源的俯視角度(根據圖片假設的),弧度值
vec_az = np.pi/4. # 光源的方位角度(根據圖片假設的),弧度值
dx = np.cos(vec_el)*np.cos(vec_az) #光源對x 軸 單位長度 的影響
dy = np.cos(vec_el)*np.sin(vec_az) #光源對y 軸 單位長度 的影響
dz = np.sin(vec_el) #光源對z 軸 單位長度 的影響
b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源歸一化
b = b.clip(0,255)#為避免資料越界,將生成的灰度值裁剪至0‐255區間
im = Image.fromarray(b.astype('uint8')) #重構影象
im.save('./beijingHD.jpg')
程式碼分析:
原理:利用畫素之間的梯度值和虛擬深度值對影象進行重構,根據灰度變化來模擬人類視覺的遠近程度。