天天看點

資料分析(1):Numpy庫與應用

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