科学计算和可视化

一、科学计算库学习报告

(一)numpy库

(1)Numpy是什么

numpy很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。

NumPy的全名为Numeric Python,是一个开源的Python科学计算库,它包括:

  • 一个强大的N维数组对象ndrray;
  • 比较成熟的(广播)函数库;
  • 用于整合C/C++和Fortran代码的工具包;
  • 实用的线性代数、傅里叶变换和随机数生成函数

Numpy中定义的最重要的对象是成为ndarray的N维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。

ndarray属性:ndim属性,表示维度个数;shape属性,表示各维度大小;dtype属性,表示数据类型。

(2) 数组常用函数

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最大、最小元素的索引

(3)数组组合

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按列方向组合

(4)数组分割

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

(5)数组修剪和压缩

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

(6)数组属性

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型

(7)数组计算

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的迹,即对角线元素之和

(3)实例

import numpy
print ('使用列表生成一维数组')
data = [1,2,3,4,5]
x = numpy.array(data)
print(x)
print (x.dtype)
print(x.ndim)
print(x.shape)


print ('使用列表生成二维数组')
data = [[1,0],[2,0],[3,3]]
x = numpy.array(data)
print (x) 
print (x.ndim) 
print (x.shape)

执行效果如下:

(二)matplotlib库

(1)概述:

matplotlib是基于numpy的一套Python工具包。这个包提供了丰富的数据绘图工具,主要用于绘制一些统计图形。

在代码执行过程中,有两种方式更改参数:

  • 使用参数字典(rcParams)
  • 调用matplotlib.rc()命令 通过传入关键字元祖,修改参数

如果不想每次使用matplotlib时都在代码部分进行配置,可以修改matplotlib的文件参数。可以用matplot.get_config()命令来找到当前用户的配置文件目录。

配置文件包括以下配置项:

axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
backend: 设置目标暑促TkAgg和GTKAgg
figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
font: 字体集(font family)、字体大小和样式设置
grid: 设置网格颜色和线性
legend: 设置图例和其中的文本的显示
line: 设置线条(颜色、线型、宽度等)和标记
patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。

 (2)一般函数

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),将逗号省略。 

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

x(y)为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, ‘*’) 第二条无曲线,只有点

 

线条风格linestyle或ls描述线条风格linestyle或ls描述
‘-‘ 实线 ‘:’ 虚线  
‘–’ 破折线 ‘None’,’ ‘,’’ 什么都不画  
‘-.’ 点划线  

 

标记maker描述标记描述
‘o’ 圆圈 ‘.’
‘D’ 菱形 ‘s’ 正方形
‘h’ 六边形1 ‘*’ 星号
‘H’ 六边形2 ‘d’ 小菱形
‘_’ 水平线 ‘v’ 一角朝下的三角形
‘8’ 八边形 ‘<’ 一角朝左的三角形
‘p’ 五边形 ‘>’ 一角朝右的三角形
‘,’ 像素 ‘^’ 一角朝上的三角形
‘+’ 加号 竖线
‘None’,’’,’ ‘ ‘x’ X

 (4).plot 显示中文字符

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

rcParams的属性:

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

(5)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表示在选中区域的延伸。

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

(7)实例:

绘制成绩雷达图

import matplotlib.pyplot as plt
import numpy as np
import matplotlib
plt.rcParams['font.family']='SimHei'

labels=np.array(['总成绩','单选','程序题','剩余用时','复写率'])
nAttr=5
data=np.array([9.5,9,10,6,9])
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
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,'b*-',color='y',linewidth=3)
plt.fill(angles,data,facecolor='g',alpha=0.25)
plt.thetagrids(angles*180/np.pi,labels)
plt.figtext(0.52,0.95,'python123的成绩表',ha='center')
plt.grid(True)
plt.savefig('scorce_radar.JPG')
plt.show()

执行代码效果:

(三)自定义手绘风

from PIL import Image
import numpy as np
vec_el = np.pi/2.2
vec_az = np.pi/4
depth = 10
im = Image.open('Ronghao Lis.jpg').convert('L')
a = np.asarray(im).astype('float')
grad = np.gradient(a)
grad_x, grad_y = grad
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
dx = np.cos(vec_el)*np.cos(vec_az)
dy = np.cos(vec_el)*np.sin(vec_az)
dz = np.sin(vec_el)
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)
im2 = Image.fromarray(a2.astype('uint8'))
im2.save('Ronghao Lis1.jpg')

(四)绘制数学规律

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='KaiTi'
matplotlib.rcParams['font.sans-serif']=['KaiTi']
x=np.linspace(0, 2*np.pi, 500)            # 创建自变量数组
y1=np.sin(x)                             # 创建函数值数组
y2=np.cos(x)
y3=np.sin(x*x)
plt.figure(1)                              # 创建图形
ax1=plt.subplot(2,2,1)                   # 第一行第一列图形
ax2=plt.subplot(2,2,2)
ax3=plt.subplot(212, facecolor='y')       # 第一行第二列图形      # 第二行
plt.sca(ax1)                               # 选择ax1
plt.plot(x,y1,color='red')                 # 绘制红色曲线
plt.ylim(-1.2,1.2)                         # 限制y坐标轴范围
plt.sca(ax2)                               # 选择ax2
plt.plot(x,y2,'b--')                       # 绘制蓝色曲线
plt.ylim(-1.2,1.2)
plt.sca(ax3)                               # 选择ax3
plt.plot(x,y3,'g--')
plt.ylim(-1.2,1.2)
plt.title('图像')
plt.show()

代码执行效果:

原文地址:https://www.cnblogs.com/hx494682/p/12804054.html