任务22 科学计算和可视化
1 from PIL import Image
2 import numpy as np
3
4 a = np.asarray(Image.open('D:\\python_common_exercise\\exercise\\taylor.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('D:\\python_common_exercise\\exercise\\taylor_2.jpg')


2. numpy 和 matplotlib 笔记
(1) numpy
Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素,虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中Numpy函数库中的matrix与MATLAB中matrices等价。
直接看一个例子:
1 # 生成数据 , 保存数据 , 读取保存数据
2 import numpy as np
3 x = np.arange(10)
4 print(x)
5
6 np.save('save_x', x)
7 np.load('save_x.npy')
1 # 数据形式
2 import numpy as np
3 a = np.mat('1,3;5,7')
4 b = np.mat([[1,2],[3,4]])
5 print(a)
6 print(b)
7 print(type(a))
8 print(type(b))
9
10 c = np.array([[1,3],[4,5]])
11 print(c)
12 print(type(c))
输出:
[[1 3]
[5 7]]
[[1 2]
[3 4]]
<class 'numpy.matrix'>
<class 'numpy.matrix'>
[[1 3]
[4 5]]
<class 'numpy.ndarray'>
1 # 保存数据
2 import numpy as np
3 x = np.arange(10)
4 print(x)
5 np.save('save_x', x)
6
7 #读取数据
8 np.load('save_x.npy')
(2)matplotlib
简单画图
import matplotlib.pyplot as plt x = [0,1,2,3] y = [0,1,2,3] plt.plot(x, y) plt.show()

改变颜色和线条形式
import matplotlib.pyplot as plt x = [0,1,2,3] y = [0,1,2,3] plt.plot(x, y,'r--') plt.show()

画多个函数图像
import matplotlib.pyplot as plt x1 = [0,1,2,3] y1 = [0,1,2,3] x2 = [2,4,6,8] y2 = [4,8,12,16] plt.plot(x1, y1,'r-',x2,y2,'k--') plt.show()

import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50) # linspace 是划分多少等分 y = x**2 + 3*x + 2 plt.plot(x, y) plt.show()

成绩雷达图
#e19.1DrawDotaRadar.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif']=['SimHei']
labels=np.array(['综合','第一周','第二周','第三周','第四周','第五周','第六周','第七周'])
nAttr=8
Python=np.array([88.7,85,90,95,93,96,100,98])
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
Python=np.concatenate((Python,[Python[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(facecolor="white")
plt.subplot(111,polar=True)
plt.plot(angles,Python,'bo-',color='g',linewidth=2)
plt.fill(angles,Python,facecolor='g',alpha=0.2)
plt.thetagrids(angles*180/np.pi,labels)
plt.figtext(0.52,0.95,'python成绩分析图',ha='center')
plt.grid(True)
plt.savefig('dota_radar.JPG')
plt.show()


浙公网安备 33010602011771号