numpy和matplotlib的簡單應用
一、numpy庫
1.什么是numpy
NumPy系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也可以用來表示矩陣(matrix))。
numpy是科學計算包,支持N維數組運算、處理大型矩陣、成熟的廣播函數庫、矢量運算、線性代數、傅里葉變換、隨機數生成,並可與C++/Fortran語言無縫結合。
2.numpy的安裝
在Python v3中默認安裝已經包含了numpy
如果沒有安裝,可以在命令行(ctrl+R,輸入cmd)中輸入pip install numpy即可自動安裝使用
3.numpy的使用
注意:這里的矩陣跟線性代數(高等代數)中的矩陣一致,運算方法一致
(1)導入模塊
import numpy as np #用np來代替numpy
(2)生成數組(創建數組)
1 import numpy as np 2 print(np.array([1, 2, 3, 4, 5])) # 把列表轉換為數組
3 print(np.array((1, 2, 3, 4, 5))) # 把元組轉換成數組
4 print(np.array(range(5))) # 把range對象轉換成數組
5 print(np.array([[1, 2, 3], [4, 5, 6]])) # 二維數組
6 print(np.arange(8)) # 類似於內置函數range()
7 print(np.arange(1, 10, 2)) 8 print(np.linspace(0, 10, 11)) # 等差數組,包含11個數
9 print(np.linspace(0, 10, 11, endpoint=False)) # 不包含終點
10 print(np.logspace(0, 100, 10)) # 對數數組
11 print(np.logspace(1,6,5, base=2)) # 對數數組,相當於2 ** np.linspace(1,6,5)
12 print(np.zeros(3)) # 全0一維數組
13 print(np.ones(3)) # 全1一維數組
14 print(np.zeros((3,3))) # 全0二維數組,3行3列
15 print(np.zeros((3,1))) # 全0二維數組,3行1列
16 print(np.zeros((1,3))) # 全0二維數組,1行3列
17 print(np.ones((1,3))) # 全1二維數組
18 print(np.ones((3,3))) # 全1二維數組
19 print(np.identity(3)) # 單位矩陣
20 print(np.identity(2)) 21 print(np.empty((3,3))) # 空數組,只申請空間而不初始化,元素值是不確定的
結果如圖所示(因為是一次性輸出全部,所以顯示不是很好)
(3)數組的運算
1/ 數組與數值的運算
x=np.array((1,2,3,4,5)) #創建數組
x*2 #乘法
x/2 #除法
x//2 #整除
x**3 #冪次方
x+2 #加法
x%3 #求余
2**x #2的(x中的每一個元素)次方,同時生成另一個數組
2/x #2除以x中的每一個元素,同時生成另外一個數組
63//x #63除以x中的每一個元素,取整數,同時生成另外一個數組
2/ 數組與數組的運算
a= np.array((1,2,3)) #先創建兩個數組
b=np.array(([1,2,3],[4,5,6],[7,8,9]))
數組之間的基本運算
c=a*b
c/b
a+a
a*a
c-a
c/a
(4) 數組的轉置
b=np.array(([1,2,3],[4,5,6],[7,8,9]))
b.T #轉置
值得注意的是:一維數組轉置以后和原來是一樣的
(5)點積和內積
a = np.array((5, 6, 7)) #創建數組a
b = np.array((6, 6, 6)) #創建數組b
a.dot(b) #向量內積
np.dot(a,b)
c = np.array(([1,2,3],[4,5,6],[7,8,9])) # 二維數組
c.dot(a) # 二維數組的每行與一維向量計算內積
a.dot(c) # 一維向量與二維向量的每列計算內積
(6) 元素訪問
b = np.array(([1,2,3],[4,5,6],[7,8,9]))
b[0] # 第0行
b[0][0] # 第0行第0列的元素值
b[0,2] # 第0行第2列的元素值
b[[0,1]] # 第0行和第1行
b[[0,1], [1,2]] #第0行第1列的元素和第1行第2列的元素
x = np.arange(0,100,10,dtype=np.floating)
x[[1, 3, 5]] # 同時訪問多個位置上的元素
x[[1, 3, 5]] = 3 # 把多個位置上的元素改為相同的值
x[[1, 3, 5]] = [34, 45, 56] # 把多個位置上的元素改為不同的值
(7)數組支持函數運算
np.sin(x) #求正弦值
np.cos(x) #求余弦值
np.round(_) #四舍五入
x = np.random.rand(10) * 10 # 包含10個隨機數的數組
np.floor(x) # 所有元素向下取整
np.ceil(x) # 所有元素向上取整
(8) 改變數組大小
a = np.arange(1, 11, 1) #創建一維數組
a.shape = 2, 5 #將數組改為2行5列
a.shape = 5, -1 #將元素分成5列, -1表示自動計算,原地修改
b = a.reshape(2,5) # reshape()方法返回新數組
(9) 切片操作
a[::-1] # 反向切片
a[::2] # 隔一個取一個元素
a[:5] # 前5個元素
c[0, 2:5] # 第0行中下標[2,5)之間的元素值
c[1] # 第1行所有元素
c[2:5, 2:5] # 行下標和列下標都介於[2,5)之間的元素值
(10) 布爾運算(結果一般是True或者False顯示)
x > 0.5 # 比較數組中每個元素值是否大於0.5
x[x>0.5] # 獲取數組中大於0.5的元素,可用於檢測和過濾異常值
x < 0.5
np.all(x<1) # 測試是否全部元素都小於1
np.any([1,2,3,4]) # 是否存在等價於True的元素
a > b # 兩個數組中對應位置上的元素比較
a[a>b] #輸出相對應元素a>b的元素位置
(11)取整運算
x = np.random.rand(10)*50 # 10個隨機數
np.int64(x) # 取整
np.int32(x)
(12)廣播
a = np.arange(0,60,10).reshape(-1,1) # 創建列向量
b = np.arange(0,6) # 創建行向量
a[0] + b # 數組與標量的加法
a + b #行向量與列向量的相加
a*b #行向量與列向量的相乘
(13) 計算唯一值以及出現的次數
x = np.random.randint(0, 10, 7) #創建0到10之間的隨機數,個數為7
np.bincount(x) #計算元素出現的次數,由最小的元素開始,到最大值
np.sum(_) # 所有元素出現次數之和等於數組長度
np.unique(x) # 返回唯一元素值
(14) 矩陣運算
a_list = [3, 5, 7]
a_mat = np.matrix(a_list) # 創建矩陣
a_mat.T # 矩陣轉置
a_mat.shape # 矩陣形狀
a_mat.size # 元素個數
a_mat.mean() # 元素平均值
a_mat.sum() # 所有元素之和
a_mat.max() # 最大值
a_mat.max(axis=1) # 橫向最大值
a_mat.max(axis=0) # 縱向最大值
a_mat * b_mat.T # 矩陣相乘
c_mat = np.matrix([[1, 5, 3], [2, 9, 6]]) # 創建二維矩陣
c_mat.argsort(axis=0) # 縱向排序后的元素序號
c_mat.argsort(axis=1) # 橫向排序后的元素序號
d_mat.diagonal() # 矩陣對角線元素
x = np.matrix(np.random.randint(0, 10, size=(3,3)))
x.std() # 標准差
x.std(axis=1) # 橫向標准差
x.std(axis=0) # 縱向標准差
x.var(axis=0) # 縱向方差
二、matplotlib庫
1.什么是matplotlib庫
matplotlib模塊依賴於numpy模塊和tkinter模塊,可以繪制多種形式的圖形,包括線圖、直方圖、餅狀圖、散點圖、誤差線圖等等。
2.matplotlib庫的安裝
在命令行(ctrl+R,輸入cmd)中輸入pip install matplotlib即可自動安裝使用
3.matplotlib庫的的使用
導入
import matplotlib
繪制正弦函數圖像
1 import numpy as np 2 import pylab as pl 3
4 t = np.arange(0.0, 2.0*np.pi, 0.01) #生成數組,0到2π之間,以0.01為步長
5 s = np.sin(t) #對數組中所有元素求正弦值,得到新數組
6 pl.plot(t,s) #畫圖,以t為橫坐標,s為縱坐標
7 pl.xlabel('x') #設置坐標軸標簽
8 pl.ylabel('y') 9 pl.title('sin') #設置圖形標題
10 pl.show() #顯示圖形
結果如圖所示
繪制散點圖
1 import numpy as np 2 import pylab as pl 3 a = np.arange(0, 2.0*np.pi, 0.1) 4 b = np.cos(a) 5 pl.scatter(a,b) 6 pl.show()
結果如圖所示
繪制帶有中文標簽和圖例的圖像
1 import numpy as np 2 import pylab as pl 3 import matplotlib.font_manager as fm 4
5 myfont = fm.FontProperties(fname=r'C:\Windows\Fonts\STKAITI.ttf') #設置字體
6 t = np.arange(0.0, 2.0*np.pi, 0.01) # 自變量取值范圍
7 s = np.sin(t) # 計算正弦函數值
8 z = np.cos(t) # 計算余弦函數值
9 pl.plot(t, s, label='正弦') 10 pl.plot(t, z, label='余弦') 11 pl.xlabel('x-變量', fontproperties='STKAITI', fontsize=18) # 設置x標簽
12 pl.ylabel('y-正弦余弦函數值', fontproperties='simhei', fontsize=18) 13 pl.title('sin-cos函數圖像', fontproperties='STLITI', fontsize=24) 14 pl.legend(prop=myfont) # 設置圖例
15 pl.show()
結果如圖所示
等等~~~~~~~~~~~~~~~
三、用雷達圖表示python123中的成績數據
1 import numpy as np 2 import matplotlib.pyplot as plt 3 import matplotlib 4 matplotlib.rcParams['font.family']='LiSu'#定義字體
5 matplotlib.rcParams['font.sans-serif'] = ['LiSu'] 6 labels=np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])#定義標簽
7 data=np.array([8,10,9,10,11,7]) 8 angles=np.linspace(0,2*np.pi,6,endpoint=False) 9 data=np.concatenate((data,[data[0]])) 10 angles=np.concatenate((angles,[angles[0]])) 11 fig=plt.figure(facecolor="yellow")#顏色設置
12 plt.subplot(111,polar=True) 13 plt.plot(angles,data,'bo-',color='g',linewidth=2) 14 plt.fill(angles,data,facecolor='g',alpha=0.25) 15 plt.thetagrids(angles*180/np.pi,labels) 16 plt.figtext(0.52,0.95,'xiayiLL的python123成績雷達圖',ha='center')#圖像命名
17 plt.grid(True) 18 plt.show()
結果如圖所示
四、自定義手繪風
代碼如下
1 # -*- coding: utf-8 -*- 2 3 ''' 手繪圖像效果 ''' 4 import numpy as np 5 from PIL import Image 6 vec_el = np.pi/2.2 # 光源的俯視角度,弧度值 7 vec_az = np.pi/4. # 光源的方位角度,弧度值 8 depth = 6. # 深度權值,值越小背景區域越接近白色,值越大背景區域越接近黑色 9 im = Image.open('C:\\Users\Administrator\Desktop\spyder\路飛.jpg').convert('L') # 打開圖像並轉變為灰度模式 10 a = np.asarray(im).astype('float') 11 grad = np.gradient(a) # 取圖像灰度的梯度值 12 grad_x, grad_y = grad # 分別取圖像的橫縱梯度值 13 grad_x = grad_x * depth / 100. 14 grad_y = grad_y * depth / 100. 15 dx = np.cos(vec_el) * np.cos(vec_az) # 光源對x軸的影響 16 dy = np.cos(vec_el) * np.sin(vec_az) # 光源對y軸的影響 17 dz = np.sin(vec_el) # 光源對z軸的影響 18 A = np.sqrt(grad_x**2 + grad_y**2 + 1.) 19 uni_x = grad_x/A 20 uni_y = grad_y/A 21 uni_z = 1./A 22 a2 = 255*(dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化 23 a2 = a2.clip(0, 255) # 預防溢出 24 im2 = Image.fromarray(a2.astype('uint8')) # 重構圖像 25 im2.save('HandMade_.jpg') # 保存圖像 26 im2.show() # 顯示圖像
原圖如下
經代碼轉變手繪圖
五、感興趣的圖像
分段函數圖像,代碼如下
1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 x = np.linspace(0,100,1000) 5 interval0 = [1 if (i<30) else 0 for i in x] 6 interval1 = [1 if (i>=30 and i<50) else 0 for i in x] 7 interval2 = [1 if (i>=50) else 0 for i in x] 8 y = np.cos(x)* interval0 + x * interval1 + np.sin(x)*interval2 9 plt.plot(x,y) 10 plt.show()
結果如圖所示