1. 程式人生 > >【MOOC】Python資料分析與展示-北京理工大學-【第一週】資料分析之表示

【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')

程式碼分析:
原理:利用畫素之間的梯度值和虛擬深度值對影象進行重構,根據灰度變化來模擬人類視覺的遠近程度。

這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述