一、科学计算库学习报告
(一)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()
代码执行效果: