python數據分析及展示(一)


一、IDE選擇

Anaconda軟件:開源免費,https://www.anaconda.com下載,根據系統進行安裝。由於下載速度慢,可以去清華大學開源軟件鏡像站下載。

Spyder軟件設置:Tools-Preferences-Syntax coloring-Scheme設置成Monokai,保護眼睛。

Spyder里面有一個IPython,交互式調試工具。

二、NumPy庫

1. 數據的維度:一組數據的組織形式。

從一個數據到一組數據,表達多種數據含義。

一維數據:由對等關系的有序或無序數據組成,采用線性方式組織,對應列表、集合、數組等。

二維數據:由多個一維數據構成,是一維數據的組合形式,字典或數據表示格式,如json等。

多維數據:由一維或二維數據在新維度上拓展形成。

高維數據:僅利用最基本的二元關系展示數據間的復雜結構,如鍵值對。

2. NumPy庫

開源的Python科學計算基礎庫。

import numpy as np  引用模塊的別名,建議這樣的別名。

為什么需要一個額外的數據類型呢?如:N維數組對象ndarray,一維數組np.array([0,1,2,3,4])

好處:a 數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據。

           b 設置專門的數組對象,經過優化,可以提升這類應用的運算速度,底層是C語言,故效率高。

           c 科學計算中,一個維度所有數據的類型往往相同,數組對象采用相同的數據類型,有助於節省運算和存儲空間。

ndarray數組一般要求所有元素類型相同,數組下標從0開始。

ndarray對象的屬性

屬性       說明
.ndim     秩,即軸的數量或維度的數量
.shape    ndarray對象的尺度,對於矩陣,n行m列
.size       ndarray對象元素的個數,相當於.shape中n*m的值
.dtype     ndarray對象的元素類型
.itemsize ndarray對象中每個元素的大小,以字節為單位

3. ndarray數組的元素類型

ndarray有多種數據類型,原因是,對元素類型精細定義,有助於NumPy合理使用存儲空間並優化性能,有助於對程序規模的預測。

 ndarray的元素類型(1)

數據類型 說明
bool        布爾類型,True或False
intc         與C語言中的int類型一致,一般是int32或int64
intp        用於索引的整數,與C語言中ssize_t一致,int32或int64
int8        字節長度的整數,取值:[‐128, 127]
int16      16位長度的整數,取值:[‐32768, 32767]
int32      32位長度的整數,取值:[‐231, 231‐1]
int64      64位長度的整數,取值:[‐263, 263‐1]

ndarray的元素類型(2)

數據類型 說明
uint8       8位無符號整數,取值:[0, 255]
uint16     16位無符號整數,取值:[0, 65535]
uint32     32位無符號整數,取值:[0, 232‐1]
uint64     64位無符號整數,取值:[0, 264‐1]
float16   16位半精度浮點數:1位符號位,5位指數,10位尾數
float32   32位半精度浮點數:1位符號位,8位指數,23位尾數
float64   64位半精度浮點數:1位符號位,11位指數,52位尾數

ndarray的元素類型(3)

數據類型      說明
complex64   復數類型,實部和虛部都是32位浮點數
complex128 復數類型,實部和虛部都是64位浮點數

4. ndarray數組的創建

(1)從Python中的列表、元組等類型創建ndarray數組
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
當np.array()不指定dtype時,NumPy將根據數據情況關聯一個dtype類型

如:x=np.array([0,1,2,3])

(2)使用NumPy中函數創建ndarray數組,如:arange, ones, zeros等

函數                      說明
np.arange(n)        類似range()函數,返回ndarray類型,元素從0到n‐1
np.ones(shape)    根據shape生成一個全1數組,shape是元組類型
np.zeros(shape)   根據shape生成一個全0數組,shape是元組類型
np.full(shape,val)  根據shape生成一個數組,每個元素值都是val
np.eye(n)              創建一個正方的n*n單位矩陣,對角線為1,其余為0

函數                      說明
np.ones_like(a)    根據數組a的形狀生成一個全1數組
np.zeros_like(a)   根據數組a的形狀生成一個全0數組
np.full_like(a,val)  根據數組a的形狀生成一個數組,每個元素值都是val

(3)使用NumPy中其他函數創建ndarray數組

函數                    說明
np.linspace()       根據起止數據等間距地填充數據,形成數組
np.concatenate() 將兩個或多個數組合並成一個新的數組

a=np.linspace(1,10,4)

b=np.linspace(1,10,4,endpoint=False)

c=np.concatenate((a,b))

5. ndarray數組的變換

方法                          說明
.reshape(shape)      不改變數組元素,返回一個shape形狀的數組,原數組不變
.resize(shape)          與.reshape()功能一致,但修改原數組
.swapaxes(ax1,ax2) 將數組n個維度中兩個維度進行調換
.flatten()                    對數組進行降維,返回折疊后的一維數組,原數組不變

6. ndarray數組的操作

索引:獲取數組中特定位置元素的過程
切片:獲取數組元素子集的過程

一維數組的索引和切片:與Python的列表類似

多維數組的索引:a[1,2,3]

7. ndarray數組的運算

數組與標量之間的運算作用於數組的每一個元素

NumPy一元函數
對ndarray中的數據執行元素級運算的函數

函數                           說明
np.abs(x)  np.fabs(x) 計算數組各元素的絕對值
np.sqrt(x)                   計算數組各元素的平方根
np.square(x)             計算數組各元素的平方
np.log(x)  np.log10(x) 
np.log2(x)                 計算數組各元素的自然對數、10底對數和2底對數
np.ceil(x)  np.floor(x) 計算數組各元素的ceiling值或 floor值

np.rint(x)                    計算數組各元素的四舍五入值
np.modf(x)                 將數組各元素的小數和整數部分以兩個獨立數組形式返回
np.cos(x)  np.cosh(x)
np.sin(x)  np.sinh(x)
np.tan(x)  np.tanh(x)
                                   計算數組各元素的普通型和雙曲型三角函數
np.exp(x)                    計算數組各元素的指數值
np.sign(x)                   計算數組各元素的符號值,1(+), 0, ‐1(‐)

NumPy二元函數

函數                                    說明
+ ‐ * / **                              兩個數組各元素進行對應運算
np.maximum(x,y)  np.fmax()
np.minimum(x,y) np.fmin()
                                             元素級的最大值/最小值計算
np.mod(x,y)                          元素級的模運算
np.copysign(x,y)                   將數組y中各元素值的符號賦值給數組x對應元素
> < >= <= == !=                      算術比較,產生布爾型數組

三、數據存取與函數

1. 數據的CSV文件存取

CSV (Comma‐Separated Value, 逗號分隔值)
CSV是一種常見的文件格式,用來存儲批量數據

np.savetxt(frame, array,  fmt='%.18e', delimiter=None)
• frame  :  文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
• array  :  存入文件的數組
• fmt :  寫入文件的格式,例如:%d %.2f %.18e
• delimiter  :  分割字符串,默認是任何空格

a=np.arange(100).reshape(5,20)

np.savetxt('a.csv,a,fmt='%.1f',delimiter=',')

np.loadtxt(frame,  dtype=np.float,  delimiter=None, unpack=False)
• frame  :  文件、字符串或產生器,可以是.gz或.bz2的壓縮文件
• dtype :  數據類型,可選
• delimiter  :  分割字符串,默認是任何空格
• unpack  :  如果True,讀入屬性將分別寫入不同變量

b=np.loadtxt('a.csv',dtype=np.int,delimiter=',')

CSV只能有效存儲一維和二維數組
np.savetxt() np.loadtxt()只能有效存取一維和二維數組

2. 多維數組的存儲

a.tofile(frame, sep='',  format='%s')
• frame  :  文件、字符串
• sep :  數據分割字符串,如果是空串,寫入文件為二進制
• format  :  寫入數據的格式

a=np.arrange(100).reshape(5,10,2)

a.tofile('b.dat',sep=',',format='%d')

np.fromfile(frame, dtype=float, count=‐1, sep='')
• frame  :  文件、字符串
• dtype :  讀取的數據類型
• count  :  讀入元素個數,‐1表示讀入整個文件
• sep :  數據分割字符串,如果是空串,寫入文件為二進制

c=np.fromfile("b.dat",dtype=np.int,sep=",").reshape(5,10,2)

需要注意:該方法需要讀取時知道存入文件時數組的維度和元素類型

a.tofile()和np.fromfile()需要配合使用

可以通過元數據文件來存儲額外信息

NumPy的便捷文件存取

np.save(fname,  array)  或 np.savez(fname,  array)
• fname :  文件名,以.npy為擴展名,壓縮擴展名為.npz
• array  :  數組變量
np.load(fname)
• fname :  文件名,以.npy為擴展名,壓縮擴展名為.npz

a=np.arrange(100).reshape(5,10,2)

np.save("a.npy",a)

b=np.load("a.npy")

3. numPy的隨機數函數

NumPy的random子庫np.random.*

函數                                   說明
rand(d0,d1,..,dn)               根據d0‐dn創建隨機數數組,浮點數,[0,1),均勻分布
randn(d0,d1,..,dn)             根據d0‐dn創建隨機數數組,標准正態分布
randint(low[,high,shape])   根據shape創建隨機整數或整數數組,范圍是[low, high)
seed(s)                              隨機數種子,s是給定的種子值,如果s一樣,產生的隨機數相同

b=np.random.randint(100,200,(3,4))

函數                                   說明
shuffle(a)                            根據數組a的第0軸進行隨排列,改變數組x
permutation(a)                   根據數組a的第0軸產生一個新的亂序數組,不改變數組x
choice(a[,size,replace,p])   從一維數組a中以概率p抽取元素,形成size形狀新數組replace表示是否可以重用元素,默認為False

uniform(low,high,size)        產生具有均勻分布的數組,low起始值,high結束值,size形狀
normal(loc,scale,size)       產生具有正態分布的數組,loc均值,scale標准差,size形狀
poisson(lam,size)              產生具有泊松分布的數組,lam隨機事件發生率,size形狀

4.numPy的統計函數

函數                                 說明
sum(a, axis=None)          根據給定軸axis計算數組a相關元素之和,axis整數或元組
mean(a, axis=None)       根據給定軸axis計算數組a相關元素的期望,axis整數或元組
average(a,axis=None,weights=None) 根據給定軸axis計算數組a相關元素的加權平均值
std(a, axis=None)            根據給定軸axis計算數組a相關元素的標准差
var(a, axis=None)            根據給定軸axis計算數組a相關元素的方差

axis=None 是統計函數的標配參數

min(a)  max(a)                計算數組a中元素的最小值、最大值
argmin(a)  argmax(a)      計算數組a中元素最小值、最大值的降一維后下標
unravel_index(index, shape) 根據shape將一維下標index轉換成多維下標
ptp(a)                             計算數組a中元素最大值與最小值的差
median(a)                      計算數組a中元素的中位數(中值)

5. numPy的梯度函數

函數 說明
np.gradient(f) 計算數組f中元素的梯度,當f為多維時,返回每個維度梯度

梯度:連續值之間的變化率,即斜率
XY坐標軸連續三個X坐標對應的Y軸值:a, b, c,其中,b的梯度是: (c‐a)/2

四、圖像的處理

1. 圖像的數組表示

RGB三個顏色通道的變化和疊加得到各種顏色,其中
• R 紅色,取值范圍,0‐255
• G 綠色,取值范圍,0‐255
• B 藍色,取值范圍,0‐255
RGB形成的顏色包括了人類視力所能感知的所有顏色。

PIL, Python Image Library
PIL庫是一個具有強大圖像處理能力的第三方庫
在命令行下的安裝方法: pip install pillow
from PIL import Image
Image是PIL庫中代表一個圖像的類(對象)

圖像是一個三維數組,維度分別是高度、寬度和像素RGB值

from PIL import  Image

import munpy as np

im=np.array(Image.open("D:/pycodes/beijing.jpg"))

print(im.shape,im.dtype)

輸出為(669,1012,3) uint8

2. 圖像的變換

a= np.array(Image.open("D:/pycodes/fcity.jpg").convert(‘L’))

b=255-a

im=Image.fromarray(b.astype('uint8))

im.save("D:/pycodes/fcity3.jpg")

3. 圖像的手繪效果

手繪效果的幾個特征:
• 黑白灰色
• 邊界線條較重
• 相同或相近色彩趨於白色
• 略有光源效果

 1 from PIL import Image
 2 import numpy as np
 3  
 4 a = np.asarray(Image.open('./beijing.jpg').convert('L')).astype('float')
 5  
 6 depth = 10.                      # (0-100)
 7 grad = np.gradient(a)             #取圖像灰度的梯度值
 8 grad_x, grad_y = grad               #分別取橫縱圖像梯度值
 9 grad_x = grad_x*depth/100.
10 grad_y = grad_y*depth/100.
11 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
12 uni_x = grad_x/A
13 uni_y = grad_y/A
14 uni_z = 1./A
15  
16 vec_el = np.pi/2.2                   # 光源的俯視角度,弧度值
17 vec_az = np.pi/4.                    # 光源的方位角度,弧度值
18 dx = np.cos(vec_el)*np.cos(vec_az)   #光源對x 軸的影響
19 dy = np.cos(vec_el)*np.sin(vec_az)   #光源對y 軸的影響
20 dz = np.sin(vec_el)              #光源對z 軸的影響
21  
22 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)     #光源歸一化
23 b = b.clip(0,255)
24  
25 im = Image.fromarray(b.astype('uint8'))  #重構圖像
26 im.save('./beijingHD.jpg')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM