Unit1、Numpy庫入門
一、資料的次元 描述一組資料的方式 1、 一維資料:由對等關系的有序或無序資料構成,采用線性方式組織。 采用清單、數組、集合等描述 Python表示: 清單和 集合類型 清單:資料類型可以不同 數組:資料類型相同 2、二維資料:由多個一維資料構成,一維資料的組合形式。(表格) Python表示: 清單類型 3、多元資料:由一維或二維資料在新次元上擴充形成。 Python表示: 清單類型 4、高維資料:僅利用最基本的二進制關系展示資料間的複雜結構。(由鍵值對将資料組合起來) Python表示: 字典類型或 資料表示格式(JSON,XML,YAML)
二、Numpy庫 一個開源的Python科學計算庫,(底層運算為C),功能:
- 一個強大的N維數組對象 ndarray
- 廣播功能函數
- 整合C/C++/Fortron代碼的工具
- 線性代數、傅裡葉變換、随機數生成等功能
Numpy是Scipy、Pandas等資料處理或科學計算庫的基礎 引用: import numpy as np ndarray:可設定專門的數組對象,經過優化,可以提升這類應用的運算速度 import numpy as np
def npSun(): a = np.array([0, 1, 2, 3, 4]) a = np.array([9, 8, 7, 6, 5])
c = a**2 + b**3 # 數組對象可以去掉元素運算所需的循環,使一維向量更像單個資料。 return c print(npSum())
ndarray(别名: array): 實際資料 (類型相同)+ (描述用) 中繼資料(次元、類型……) 軸(axis):儲存次元 秩(rank):軸的數量 屬性:.ndim 秩,次元的數量; .shape ndarray的尺度,m*n; .size 元素個數; .dtype 元素類型; .itemsize 元素大小,位元組為機關。 元素類型:bool, intc, intp, int8, int16, int32, int64, uint8(無符号整數[0,255]), uint16, uint32, uint64, float16, float32, float64, complex64(實部.real + 虛部.imag), complex128. *****也有非同質ndarray元素情況,避免使用。 建立:1、從清單、元組: x = np.array(list/tuple, dtype=np.float32) 2、使用函數: np.arange(n); np.one(shape); np.zeros(shape); np.full(shape, val); np.eye(n)...**shap為一個元組**...根據形狀: np.ones_like(a); np.zeros_like(a); np.full_like(a,val);...***...np.llinspace():根據起止資料等間距填充(np.linspace(1,10,4,endpoint=False); np.concatenate()數組合并; 3、位元組流(raw bytes): 4、檔案讀取: 變換(次元、元素類型)1、次元:.reshape(shape)原數組不變; .resize(shape)修改原數組; .swapaxes(ax1,ax2)調換次元,原數組不變 ; .flatten()降維(平化),傳回一維數組,原數組不變; 2、元素類型:new_a = a.astype(new_tupe) 轉為數組:.tolist();
ndarray操作: 索引:np.array()[n]; np.array()[i, j, k, ...] 切片:np.array()[start : end : steps]; np.array()[start : end : steps , start : end : steps , ...]
ndarray運算: 數組與标量:按每一個元素運算,np.abs(x) np.fabs(x) 求絕對值; np.sqrt(x) 平方根; np.squre(x) 平方; np.log(x) np.log(10) 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) e的指數值; np.sign(x) 符号值 …… 二進制函數:+ - * / **; np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() 對應位置元素級最值; np.mod(x,y) 元素級模運算; np.copysign(x,y) Y的符号複制給X; > < >= <= == !=;
Unit2、Numpy資料存取與函數
一、CSV檔案的存取 CSV(Comma-Separated Value,逗号分隔值)
- np.savetxt(frame, array, fmt='%.18e', delimiter=None)
-
- frame: 檔案、字元串或産生器,可以使.gz或.bz2的壓縮檔案。
- array:存入檔案的數組。
- fmt:寫入檔案中每個元素的格式:%d %.2f %.18e(科學計算法)。
- delimiter:分割字元串,預設是任何空格。(CSV為逗号)
- np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
-
- frame: 檔案、字元串或産生器,可以使.gz或.bz2的壓縮檔案。
- dtype:資料類型,可選。
- delimiter:分割字元串,預設是任何空格。(CSV為逗号)
- unpack:如果True,讀入屬性分别寫入不同變量。
隻能有效存取一維和二維數組。
二、多元數組的存取
- a.tofile(frame, sep='', format='%s')(此時次元資訊丢失,若還原需用reshape,此前,次元資訊須單獨存在中繼資料檔案中)
-
- frame:檔案、字元串。
- sep:資料分割字元串,如果是空串,寫入檔案為二進制(可作為檔案備份方式)。
- format:寫入資料的格式。
- np.fromfile(frame, dtype=float, count=-1, sep='')
-
- frame:檔案、字元串。
- dtype:讀取檔案類型。
- count:讀入元素個數,-1表示讀入整個檔案。
- sep:資料分割字元串,如果是空串,寫入檔案為二進制。
- Numpy的便捷檔案存取;
-
- np.save(fname, array) 或 np.savez(fname, array):
-
- frame:檔案名,以.npy為擴充名,壓縮擴充名為.npz
- array:數組變量
- np.load(fname)
三、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是給的種子值。相同的種子,産生的随機數相同。
- shuffle(a) 根據數組a的第0軸進行随排列,改變數組x
- permutation(a) 根據數組a的第0軸産生一個新的亂序數組,不改變數組x
- choice(a[, size, replace, p]) 從一維數組a中以機率p抽取元素,形成size形狀新數組replace表示是否可重取元素
- uniform(low,high.size) 産生具有均勻分布的數組,low起始值,high結束值,size形狀
- normal(loc, scale, size) 産生具有正态分布的數組,loc均值,scale标準差,size形狀
- poisson(lam,size) 産生泊松分布的數組,lam随機事件發生率,size形狀。
四、Numpy的統計函數 調用:numpy.*
- sum(a, axis=None) 給定軸axis,計算數組a相關元素之和,axis整數或元組
- mean(a, axis=None) 給定軸axis,計算數組a相關元素期望,axis整數或元組
- average(a, axis=None, weight=None) 給定軸axis,計算數組a相關元素的權重平均值
- std(a, axis=None) 給定軸axis,計算數組a相關元素的标準差
- var(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的中位數(中值),由公式求得,結果是一個浮點數
五、Numpy的梯度函數
- np.gradient(f) 計算數組f中元素的梯度,當f為多元時,傳回每個次元梯度()。
-
- 梯度:連續值之間的變化率,即斜率。XY坐标軸連續三個X坐标對應的Y軸值:a, b, c,其中,b的梯度是:(c-a)/2,隻有一側值時,減去相鄰的值。
- 作用,在圖像和聲音處理時,梯度有利于發現檔案的邊緣。
Unit3、執行個體1:圖像的手繪效果
一、圖像的表示 圖像的RGB色彩模式:每個像素點的顔色由R、G、B(0-255)組成,每個像素3個位元組。 PIL庫,Python Image Library.(pip install pillow) from PIL import Image 圖像的數組表示:圖像是一個由像素組成的二維矩陣,每個元素是一個RGB值。 im = np.array(Image.open("***.jpg") print (im.shape, im.dtype) >>(669, 1012, 3) uint8#圖像是一個三維數組。
二、 圖像的一般變換 讀入圖像,獲得像素RGB,修改後儲存為新的檔案。 1、彩色取反圖 from PIL import Image import numpy as np a = np.array(Image.open("D:/pycode/tian_an_men.jpg")) print(a.shape, a.dtype) #(300, 451, 3) uint8 b = [255, 255, 255] -a im = Image.fromarray(b.astype('uint8')) im.save("D:/pycode/tian_an_men_2.jpg")
2、底片 from PIL import Image import numpy as np a = np.array(Image.open("D:/pycode/tian_an_men.jpg") .convert('L')) #.convert('L'),獲得灰階值,得到二維數組 b = 255 - a im = Image.fromarray(b.astype('uint8')) im.save("D:/pycode/tian_an_men_3.jpg")
3、灰階變換 from PIL import Image import numpy as np a = np.array(Image.open("D:/pycode/tian_an_men.jpg").convert('L')) #.convert('L'),獲得灰階值,得到二維數組 c = (100/255)*a + 150 #區間變換 im = Image.fromarray(c.astype('uint8')) im.save("D:/pycode/tian_an_men_4.jpg")
4、高灰階值 from PIL import Image import numpy as np a = np.array(Image.open("D:/pycode/tian_an_men.jpg").convert('L')) #.convert('L'),獲得灰階值,得到二維數組 d = 255*(a/255)**2 #像素平方,提高銳度 im = Image.fromarray(d.astype('uint8')) im.save("D:/pycode/tian_an_men_4.jpg")
三、圖像的手繪效果
- 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. -#使用柱坐标系,虛拟高度為1
- A = np.sqrt(grad_x**2 + grad_y**2 + 1.) - 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) #限定取值範圍 -
- im = Image.fromarray(b.astype('uint8')) #重構圖像 - im.save('./beijingHD.jpg')