科学计算和可视化

Posted hjy567jiayouya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了科学计算和可视化相关的知识,希望对你有一定的参考价值。

numpy库

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,是一个强大的科学计算环境。

一、数组常用函数

1.where() 
按条件返回数组的索引值 
2.take(a,index) 
从数组a中按照索引index取值 
3.linspace(a,b,N) 
返回一个在(a,b)范围内均匀分布的数组,元素个数为N个 
4.a.fill() 
将数组的所有元素以指定的值填充 
5.diff(a) 
返回数组a相邻元素的差值构成的数组 
6.sign(a) 
返回数组a的每个元素的正负符号 
7.piecewise(a,[condlist],[funclist]) 
数组a根据布尔型条件condlist返回对应元素结果 
8.a.argmax(),a.argmin() 
返回a最大、最小元素的索引

二、改变数组维度

a.ravel(),a.flatten(): 
将数组a展平成一维数组
a.shape=(m,n),a.reshape(m,n): 
将数组a转换成m*n维数组 
3.a.transpose,a.T 
转置数组a

三、数组组合

1.hstack((a,b)),concatenate((a,b),axis=1) 
将数组a,b沿水平方向组合 
2.vstack((a,b)),concatenate((a,b),axis=0) 
将数组a,b沿竖直方向组合 
3.row_stack((a,b)) 
将数组a,b按行方向组合 
4.column_stack((a,b)) 
将数组a,b按列方向组合

四、数组分割

1.split(a,n,axis=0),vsplit(a,n) 
将数组a沿垂直方向分割成n个数组 
2.split(a,n,axis=1),hsplit(a,n) 
将数组a沿水平方向分割成n个数组

五、数组修剪和压缩

1.a.clip(m,n) 
设置数组a的范围为(m,n),数组中大于n的元素设定为n,小于m的元素设定为m 
2.a.compress() 
返回根据给定条件筛选后的数组

六、数组属性

1.a.dtype 
数组a的数据类型 
2.a.shape 
数组a的维度 
3.a.ndim 
数组a的维数 
4.a.size 
数组a所含元素的总个数 
5.a.itemsize 
数组a的元素在内存中所占的字节数 
6.a.nbytes 
整个数组a所占的内存空间 
7.a.astype(int) 
转换a数组的类型为int型

七、数组计算

1.average(a,weights=v) 
对数组a以权重v进行加权平均 
2.mean(a),max(a),min(a),middle(a),var(a),std(a) 
数组a的均值、最大值、最小值、中位数、方差、标准差 
3.a.prod() 
数组a的所有元素的乘积 
4.a.cumprod() 
数组a的元素的累积乘积 
5.cov(a,b),corrcoef(a,b) 
数组a和b的协方差、相关系数 
6.a.diagonal() 
查看矩阵a对角线上的元素 
7.a.trace() 
计算矩阵a的迹,即对角线元素之和

matplotlib库

一、一般函数
plt.savefig(‘test’, dpi = 600) :将绘制的图画保存成png格式,命名为 test

plt.ylabel(‘Grade’) : y轴的名称 

plt.axis([-1, 10, 0, 6]) : x轴起始于-1,终止于10 ,y轴起始于0,终止于6

plt.subplot(3,2,4) : 分成3行2列,共6个绘图区域,在第4个区域绘图。排序为行优先。也可 plt.subplot(324),将逗号省略。

 二、.plot函数

plt.plot(x, y, format_string, **kwargs):

 x为x轴数据,可为列表或数组;

y同理;
format_string 为控制曲线的格式字符串;
**kwargs 第二组或更多的(x, y, format_string)
format_string: 由 颜色字符、风格字符和标记字符组成。

颜色字符:‘b’蓝色 ;‘#008000’RGB某颜色;‘0.8’灰度值字符串

风格字符:‘-’实线;‘–’破折线; ‘-.’点划线; ‘:’虚线 ; ‘’‘’无线条

标记字符:‘.’点标记 ‘o’ 实心圈 ‘v’倒三角 ‘^’上三角
eg: plt.plot(a, a1.5, ‘go-’, a, a2, ‘*’) 第二条无曲线,只有点

三、.plot 显示中文字符

pyplot默认并不支持中文显示,需要 rcParams 修改字体来实现 

rcParams的属性:

‘font.family’ 用于显示字体的名字
‘font.style’ 字体风格,正常’normal’ 或斜体’italic’
‘font.size’ 字体大小,整数字号或者’large’ ‘x-small’

四、plt子绘图区域
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1):设定网格,选中网格,确定选中行列区域数量,编号从0开始。 

eg:

plt.subplot2grid((3, 3), (1, 0), colspan = 2) , (3,3)表示分为3行3列,(1,0)表示选中第1行,第0列的区域进行绘图,colspan=2表示在选中区域的延伸。

五、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) : 绘制直方图

 

介绍了两个库,现在来实际运用一下吧。

应用

一、成绩雷达图

输入代码如下:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import matplotlib
 4 matplotlib.rcParams[font.family]=SimHei
 5 matplotlib.rcParams[font.sans-serif] = [SimHei]
 6 labels = np.array([第一周, 第二周, 第三周, 第四周, 第五周])
 7 nAttr = 5
 8 data = np.array([20,20,20,20,9]) #数据值
 9 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
10 data = np.concatenate((data, [data[0]]))
11 angles = np.concatenate((angles, [angles[0]]))
12 fig = plt.figure(facecolor="white")
13 plt.subplot(111, polar=True)
14 plt.plot(angles,data,bo-,color =g,linewidth=2)
15 plt.fill(angles,data,facecolor=g,alpha=0.25)
16 plt.thetagrids(angles*180/np.pi, labels)
17 plt.figtext(0.52, 0.95, HuaJiao的成绩表, ha=center)
18 plt.grid(True)
19 plt.show()

成果图:

技术图片

二、手绘图

输入代码如下:

 1 from PIL import Image
 2 import numpy as np
 3 vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
 4 vec_az = np.pi/4. # 光源的方位角度,弧度值
 5 depth = 10. # (0-100)
 6 im = Image.open("D:\\\\加油鸭~\\\\我的图\\\\yee.jpg").convert(L)
 7 a = np.asarray(im).astype(float)
 8 grad = np.gradient(a) #取图像灰度的梯度值
 9 grad_x, grad_y = grad #分别取横纵图像梯度值
10 grad_x = grad_x*depth/100.
11 grad_y = grad_y*depth/100.
12 dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响
13 dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响
14 dz = np.sin(vec_el) #光源对z 轴的影响
15 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
16 uni_x = grad_x/A
17 uni_y = grad_y/A
18 uni_z = 1./A
19 a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
20 a2 = a2.clip(0,255)
21 im2 = Image.fromarray(a2.astype(uint8)) #重构图像
22 im2.save(yee.jpg)

原图与手绘图的对比:

技术图片

技术图片

看起来还是不错滴~

三、函数坐标图绘制

输入代码如下:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import matplotlib
 4 matplotlib.rcParams[font.family]=SimHei
 5 matplotlib.rcParams[font.sans-serif] = [SimHei]
 6 def Draw(pcolor, nt_point, nt_text, nt_size):
 7     plt.plot(x, y, k, label="$exp_decay$", color=pcolor, linewidth=3, linestyle="-")
 8     plt.plot(x, z, "b--", label="$cos(x^2)$", linewidth=1)
 9     plt.xlabel(时间(s))
10     plt.ylabel(幅度(mV))
11     plt.title("阻尼衰减曲线绘制")
12     plt.annotate($\\cos(2 \\pi t) \\exp(-t)$, xy=nt_point, xytext=nt_text, fontsize=nt_size,13                arrowprops=dict(arrowstyle=->, connectionstyle="arc3,rad=.1"))
14 def Shadow(a, b):
15     ix = (x>a) & (x<b)
16     plt.fill_between(x,y,0,where=ix,facecolor=grey, alpha=0.25)
17     plt.text(0.5 * (a + b), 0.2, "$\\int_a^b f(x)\\mathrm{d}x$", 18              horizontalalignment=center)
19 def XY_Axis(x_start, x_end, y_start, y_end):
20     plt.xlim(x_start, x_end)
21     plt.ylim(y_start, y_end)
22     plt.xticks([np.pi/3, 2 * np.pi/3, 1 * np.pi, 4 * np.pi/3, 5 * np.pi/3], 23                [$\\pi/3$, $2\\pi/3$, $\\pi$, $4\\pi/3$, $5\\pi/3$])
24 x = np.linspace(0.0, 6.0, 100)
25 y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8
26 z = 0.5 * np.cos(x ** 2)+0.8
27 note_point,note_text,note_size = (1, np.cos(2 * np.pi) * np.exp(-1)+0.8),(1, 1.4), 14
28 fig = plt.figure(figsize=(8, 6), facecolor="white")
29 plt.subplot(111)
30 Draw("red", note_point, note_text, note_size)
31 XY_Axis(0, 5, 0, 1.8)
32 Shadow(0.8, 3)
33 plt.legend()
34 plt.savefig(sample.JPG)
35 plt.show()

成果图

技术图片

 

以上是关于科学计算和可视化的主要内容,如果未能解决你的问题,请参考以下文章

科学计算和可视化

科学计算和可视化

科学计算和可视化

科学计算可视化

Python科学计算与可视化 C1

Python科学计算与可视化 C1