科学计算与可视化
一、numpy和matplotlib
(1)Python标准库中提供了一个array类型,用于保存数组类型数据,然而这个类型不支持多维数据 ,处理函数也不够丰富,不适合数值运算。因此,Python语言的第三方库numpy迅速得到发展,至今,numpy已经成为了科学计算事实上的一个标准库。
Numpy库处理的最基础数据类型是由同种元素构成的多维数组(ndarray)。素组中的元素的类型必须相同,数组中的元素可以用整数索引,序号从0开始,数组类型的维度(dimensions)叫做轴,轴的个数叫做秩(rank)
采用如下方式引用numpy库:
Import numpy as np
部分函数如下:
1 np.abs(x), np.fabs(x) #计算数组个元素的绝对值 2 3 np.sqrt(x) #计算数组个元素的平方根 4 5 np.square(x) #计算数组各元素的平方 6 7 np.ceil(x), np.follor(x) #计算数组个元素的向上取整值和向下取整值 8 9 np.rint(x) #计算数组个元素的四舍五入值 10 11 np.modf(x) #将数组个元素的小数和整数部分以两个独立数组形式返回 12 13 np.cos(x), np.cosh(x) #计算数组各元素的普通型和双曲型三角函数 14 15 np.exp(x) # 计算数组个元素的符号值,1代表+,-1代表-,0代表值为0
(2) Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形
通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
matplotlib图标正常显示中文
为了在图表中能够显示中文和负号等,需要下面一段设置:
import matplotlib.pyplot as plt
plt.rcParams['font.sas-serig']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
pyplot文本显示函数
plt.xlabel()#对x轴增加文本标签
plt.ylabel()#同理
plt.title()#对图形整体增加文本标签
plt.text()#在任意位置增加文本
plt. annotate(s, xy = arrow_crd, xytext = text_crd, arrowprops = dict)
#Plot的图表函数
plt.plot(x,y , fmt) #绘制坐标图
plt.boxplot(data, notch, position)#绘制箱形图
plt.bar(left, height, width, bottom) #绘制条形图
plt.barh(width, bottom, left, height) #绘制横向条形图
plt.polar(theta, r) #绘制极坐标图
plt.pie(data, explode) #绘制饼图
plt.scatter(x, y) #绘制散点图
plt.hist(x, bings, normed) #绘制直方图
二、python123的成绩
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=6#雷达图中六边形边数
data = np.array([5,9,9,10,10,9])#雷达图中标签的数据值
angles = np.linspace(0,2*np.pi,nAttr,endpoint=False)#一哥标签点到另一个标签点画笔所需旋转的角度值,取决于nAttr的大小
data = np.concatenate((data,[data[0]]))
angles = np.concatenate((angles,[angles[0]]))
fig = plt.figure(facecolor="white" )
plt.subplot(111,polar=True)
plt.plot(angles,data,'bo-',color='g',linewidth=2)#画出雷达图中不规则的六边形
plt.fill(angles,data,facecolor='g',alpha=0.25)#填充半透明颜色,即不规则的六边形颜色
plt.thetagrids(angles*180/np.pi,labels)#为雷达图设置标签,就是labels里的文字
plt.figtext(0.52,0.95,'daydayup12138——成绩表',ha='center')#命名雷达图的名字
plt.grid(True)
plt.savefig('作业成绩雷达图.JPG')#保存雷达图的图片
plt.show()
(3)公开课的作业
四、自定义手绘风
# -*- coding: utf-8 -*- """ Created on Mon Apr 22 22:09:23 2019 @author: 1 """ from PIL import Image import numpy as np vec_el = np.pi/3.3# 光源的俯视角度,弧度值 vec_az = np.pi/9#光源的方位角度,弧度值 depth = 90#(0-100)值越大,整体画面灰度值较深,有近似浮雕的效果;值越小,背景区域接近白色 im = Image.open('war.png').convert('L') a = np.asarray(im).astype('float') grad = np.gradient(a)#取图像灰度的梯度值 grad_x,grad_y = grad#分别取横纵图像梯度值 grad_x = grad_x+depth/100. gred_y = grad_y+depth/100. dx = np.cos(vec_el)*np.cos(vec_az)#光源对x轴的影响 dy = np.cos(vec_el)*np.cos(vec_az)#光源对y轴的影响 dz = np.sin(vec_el) #光源对z轴的影响 A = np.sqrt(grad_x**2+grad_y**2+1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A a2 = 255*(dx*uni_x+dy*uni_y+dz*uni_z)#光源归一化 a2 = a2.clip(0,255)#预防溢出0~255这个区间 im2 = Image.fromarray(a2.astype('uint8'))#重构图像 im2.save('war6.png')
原图: