科学计算库学习报告
科学计算需要用到numpy和matplotlib
一、numpy库介绍
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
二、numpy库的安装和引入
使用pip工具安装:
python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
引入numpy:
import numpy as np #引用numpy库,在程序的后续部分中用np代替numpy。
三、NumPy Ndarray 对象
(1)numpy常用的创建数组函数
(2)ndarray类的常用属性
实例
import numpy as np a=np.ones((4,5)) b=a.ndim c=a.shape d=a.dtype print(a,b,c,d)
输出结果
[[1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.]] 2 (4, 5) float64
(3)ndarray类的形态操作方法
(4)ndarray类的索引和切片方法
实例
import numpy as np a=np.random.rand(5,3)#生成5x3的数组,用随机数填充
a[2] #获得第二行数据
Out[34]: array([0.45159542, 0.20082672, 0.44729717])
a[1:3] Out[35]: array([[0.54773734, 0.22109951, 0.74633353], [0.45159542, 0.20082672, 0.44729717]])
a[-5:-2:2] Out[36]: array([[0.1701134 , 0.97661781, 0.2449302 ], [0.45159542, 0.20082672, 0.44729717]])
(5)numpy库的算数运算函数
(6)numpy库的比较函数
其将返回 一个布尔数组,它包含两个数组中对应元素值的比较结果,例:
(7)numpy库的其他函数
函数 | 描述 |
np.abs(x) | 计算基于元素的整型、浮点型、复数的绝对值 |
np.sqrt(x) | 计算每个元素的平方根 |
np.squre(x) | 计算每个元素的平方 |
np.ceil(x) | 计算大于或等于每个元素的最小值 |
np.floor(x) | 计算小于或等于每个元素的最大值 |
np.rint(x[,out]) | 取每个元素最近的整数并保留数据类型 |
np.sin/np.cos/np.tan(x*np.pi/180) |
利用*np.pi/180转化为弧度, 求每个元素的正弦值/余弦值/正切值 |
np.sign(x) | 计算每个元素的符号:1(+),0,-1(-) |
np.exp(x,[,out]) |
计算每个元素的e**x |
np.log(x),np.log10(x),np.log2(x) |
计算对数 |
二、matplotlib库 —— 提供数据绘画功能的第三方库
其pyplot子库主要用于实现各种数据展示图形的绘制,提供了一批操作和绘图函数,每个函数代表对图像进行的一个操作。
引用方式: >>>import matplotlib.pyplot as plt, 在后续程序中用plt代替matplotlib.pyplot。
matplotlib.pyplot库的函数,比如创建绘图区域、添加标注或者修改坐标轴等,这些函数采用plt.<b>(),其中<b>是具体函数名称
1.plt库的绘图区域函数
函数 | 描述 |
plt.figure(figsize=(width,height),facecolor=None) |
创建一个全局绘图区域,使其成为当前的绘图对象, figsize参数可以指定绘图区域的宽度和高度,单位为英寸。 |
plt.sublot(nrows,ncols,plot_number) |
在全局绘图区域内创建子绘图区域,其参数将全局绘图区域 分成nrows行和ncols列,并在plot_number区域生成一个坐标系。 |
plt.axes(rect,axisbg = 'w') |
创建一个坐标系风格的子绘图区域,参数rect=[left,bottom,width,height] 中四个变量的范围为(0,1);axisbg指背景色,默认为white。 |
plt.subplots_adjust() |
调整子绘图区域的布局 |
2.plt库的读取和显示函数
3.plt库的基础图表函数
操作 | 描述 |
plt.polt(x,y,label,color,linewidth) |
根据x,y数组绘制直\曲线; label表示设置标签并在图例(legend)中显示; color表示曲线颜色,linewidth表示曲线宽度。 |
plt.boxplot(data,notch,position) | 绘制一个箱型图(Box-plot) |
plt.bar(left,height,width,bottom) | 绘制一个条形图 |
plt.barh(bottom,width,height,left) | 绘制一个横向条形图 |
plt.polar(theta,r) | 绘制极坐标图 |
plt.pie(data,explode) | 绘制饼图 |
plt.psd(x,NFFT=256,pad_to,Fs) | 绘制功率谱密度图 |
plt.specgram(x,NFFT=256,pay_to,F) | 绘制谱图 |
plt.cohere(x,y,NFFT=256,Fs) | 绘制X—Y的相关函数 |
plt.scatter() | 绘制散点图 |
plt.step(x,y,where) |
绘制步阶图 |
plt.hist(x,bins,normed) | 绘制直方图 |
plt.contour(X,Y,Z,N) | 绘制等值图 |
plt.vlines() | 绘制垂直图 |
plt.stem(x,y,linefmt,markerfmt,basefmt) | 绘制曲线每个点到水平轴线的垂线 |
plt.plot_date() | 绘制数据日期 |
plt.plotfile() | 绘制数据后写入文件 |
实例
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np.exp(-x)+0.8 plt.plot(x,y,'k',color='r',linewidth=3,linestyle="-") plt.show()
结果
plt库的坐标轴
(1)plt库的坐标轴设置函数
(2)plt库的标签设置函数
实例
import numpy as np from matplotlib import pyplot as plt x = np.arange(1,11) y = 2 * x + 5 plt.title("坐标系标题") plt.xlabel('时间(s)') plt.ylabel('范围(m)') plt.plot(x,y) plt.show()
结果
三、雷达图绘制 —— 2019310143147
代码:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei' name = [' 第一周作业',' 第二周作业','第三周作业','第四周作业','第五周作业','第六周作业'] #标签 theta = np.linspace(0,2*np.pi,len(name),endpoint=False) #将圆根据标签的个数等比分 value = [100,100,100,100,90,100] theta = np.concatenate((theta,[theta[0]])) #闭合 value = np.concatenate((value,[value[0]])) #闭合 ax = plt.subplot(111,projection = 'polar') #构建图例 ax.plot(theta,value,'m-',lw=1,alpha = 0.75) #绘图 ax.fill(theta,value,'m',alpha = 0.75) #填充 ax.set_thetagrids(theta*180/np.pi,name) #替换标签 ax.set_ylim(0,100) #设置极轴的区间 ax.set_theta_zero_location('N') #设置极轴方向 ax.set_title('ruan的成绩表',fontsize = 25) #添加图标题 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(r'D:\d.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(r'D:\dd.jpg')
结果: