• 科学计算和可视化


    一、科学计算库学习报告

    (一)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()

    代码执行效果:

  • 相关阅读:
    API之绘图(转)
    API之子窗口创建 (转)
    函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)(二)
    _cdecl 和_stdcall及其他调用方式 (一)
    sizeof的深入理解
    VC++中2进制,10进制,16进制相互转换
    传说中的数据结构
    字符串扩展
    数据结构实验之链表七:单链表中重复元素的删除
    数据结构实验之栈一:进制转换
  • 原文地址:https://www.cnblogs.com/hx494682/p/12804054.html
Copyright © 2020-2023  润新知