zoukankan      html  css  js  c++  java
  • 科学计算和可视化

    今天的主题是有关科学计算和可视化的,其中将会包括有python的第三方库numpy以及matplotlib的学习总结及应用!

    有所涉猎的同学一定对这两个库并不陌生!它们分别是对数组的处理和数据处理的图表制作工具,在数据处理方面它们都有不俗的表现!

    接下来先让我简单介绍一下这两个库~(安装过程就不详述啦~pip install +库就能随心安装,或者你也可以选择直接安装Anaconda 强大的库函数多到你用不完,里面自然有今天所要展开了解的两个库啦~)

    numpy:

    概述:numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,它在数据处理方面有它不俗的表现力。

    创建ndarray数组:ndarray:N维数组对象(矩阵),所有元素必须是相同类型。 
    ndarray属性:ndim属性,表示维度个数;shape属性,表示各维度大小;dtype属性,表示数据类型。

    一些函数汇总:

    函数 说明
    array 将输入数据(列表、元组、数组或其他序列类型)转换为ndarray、要么推断出dtype,要么显示指定dtpye。默认直接复制输入数据
    asarray 将输入转换为ndarray,如果输入本身就是一个ndarray将不进行复制
    arange 类似于内置的range,但返回的是一个ndarray而不是列表
    ones、ones_like 根据指定的形状和dtpye创建一个全1的数组。ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1的数组
    zeros、zeros_like 类似上一项,创建全为0的数组
    empty、empty_like 创建新数组,只分配内存空间但不填充任何值
    eye、identity 创建一个正方的N*N单位矩阵(对角线为1,其余为0)

    当然还有一些通用函数,比如说我们的math库中的一些计算函数fabs,abs,sqrt,sin,cos等等,这些同样适合于ndarray,这里就不一一列举了。

    现在来看看我们的实例应用吧~

    实验一:

    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,0]]
    x = numpy.array(data)
    print (x) 
    print (x.ndim) 
    print (x.shape)
    
    print ('使用zero/ones/empty创建数组:根据shape来创建')
    x = numpy.zeros(5)
    print (x)
    x = numpy.zeros((3,3))
    print (x)
    x = numpy.ones((2,3))
    print (x)
    x = numpy.empty((3,2))
    print (x)
    
    print ('使用arrange生成连续元素')
    print (numpy.arange(5))
    print (numpy.arange(0,5,2))

    效果:

    我们看到这个试验中我们新建了一些特殊数组(单位数组即全1数组,全0数组,以及一、二维数组,当然还有其中各元素的type(类型)的讨论)

    我们还可以学习到numpy中的ndarray的数据类型,有大致下面几种:

    类型 类型代码 说明
    int8、uint8 i1、u1 有符号或无符号的8位(1个字节)整型
    int16、uint16 i2、u2 有符号或无符号的16位(2个字节)整型
    int32、uint32 i4、u4 有符号或无符号的32位(4个字节)整型
    int64、uint64 i8、u8 有符号或无符号的64位(8个字节)整型
    float16 f2 半精度浮点数
    float32 f4/f 标准的单精度浮点数。与C的float兼容
    float64 f8/d 标准的双精度浮点数。与C的double和python的float对象兼容
    float128 f16/g 扩展精度浮点数
    complex64、complex128 c8/c16 分别用两个32位、64位或128位的浮点数表示复数
    complex256 c32 复数
    bool ? 储存True和False值的布尔类型
    object O python对象类型
    string_ S 固定长度的字符串类型(每个字符1个字符)S10即为创建长度为10的字符串
    unicode_ U 固定长度的unicode类型(字节数由平台决定)U10即为创建长度为10的unicode

    实验二:

    import numpy
    
    print ('生成指定元素类型的数组:设置dtype属性')
    x = numpy.array([1,2.6,3],dtype = numpy.int64)
    print (x) 
    print (x.dtype)
    print (x.ndim) 
    print (x.shape)
    x = numpy.array([1,2,3],dtype = numpy.float64)
    print (x) 
    print (x.dtype)
    print (x.ndim) 
    print (x.shape)
    x = numpy.array([-1,-2,-3,-4],dtype = numpy.uint16)
    print (x) 
    print (x.dtype)
    print (x.ndim) 
    print (x.shape)
    
    print ('使用astype复制数组,并转换类型')
    x = numpy.array([1,2.6,3],dtype = numpy.float64)
    y = x.astype(numpy.int32)
    print (y)
    print (x)
    print (x.ndim) 
    print (x.shape)
    z = y.astype(numpy.float64)
    print (z)
    print (x.ndim) 
    print (x.shape)
    
    print ('将字符串元素转换为数值元素')
    x = numpy.array(['1','2','3'],dtype = numpy.string_)
    y = x.astype(numpy.int32)
    print (x)
    print (x.ndim) 
    print (x.shape)
    print (y)
    
    print ('使用其他数组的数据类型作为参数')
    x = numpy.array([ 1., 2.6,3. ],dtype = numpy.float32)
    y = numpy.arange(3,dtype=numpy.int32)
    print (y)
    print (y.astype(x.dtype))

    效果:

    在这个实验中,我们具体讨论了数组的不同数据类型的情况下生成数据的例子,我们尝试了int,float,和uint三种形式,得到了想要的结果(其中我们知道uint是无符号整型,它在计算机内存中一其相对应正数的补码形式存在,故会出现上述情况,-1的补码是1111 1111,值为10进制数为65535)我们还对dtype属性进行讨论,尝试了复制其属性的功能……

    实验三:

    import numpy
    print ('ndarray数组与标量/数组的运算')
    x = numpy.array([1,2,3]) 
    print (x*2)
    print (x**2)
    print (x>2)
    y = numpy.array([3,4,5])
    print (x+y)
    print (x^y)
    print (x>y)
    
    print ('ndarray的花式索引:使用整型数组作为索引')
    x = numpy.array([1,2,3,4,5,6])
    print (x[[0,1,2]])
    print (x[[-1,-2,-3]])
    x = numpy.array([[1,2],[3,4],[5,6]])
    print (x[[0,1]])
    print (x[[0,1],[0,1]]) # [1,4] 打印x[0][0]和x[1][1]
    print (x[[0,1]][:,[0,1]]) # 打印01行的01列 [[1,2],[3,4]]
    # 使用numpy.ix_()函数增强可读性
    print (x[numpy.ix_([0,1],[0,1])]) 
    x[[0,1],[0,1]] = [0,0]
    print (x)# [[0,2],[3,0],[5,6]]

    效果:

    该例有数组之间的简单的数乘运算以及bool运算和花式索引的实现~

    实验四:

    import numpy
    print ('ndarray数组的转置和轴对换')
    k = numpy.arange(9)
    m = k.reshape((3,3)) # 改变数组的shape复制生成2维的,每个维度长度为3的数组
    print (k)
    print (m)
    # 转置(矩阵)数组:T属性 : mT[x][y] = m[y][x]
    print (m.T)
    # 计算矩阵的内积 xTx
    print (numpy.dot(m,m.T)) # numpy.dot点乘
    # 高维数组的轴对象
    k = numpy.arange(8).reshape(2,2,2)
    print (k)
    print (k[1][0][0])
    # 轴变换 transpose 参数:由轴编号组成的元组
    m = k.transpose((1,0,2))
    print (m)
    print (m[0][1][0])
    # 轴交换 swapaxes (axes:轴),参数:一对轴编号
    m = k.swapaxes(0,1)
    print (m)
    print (m[0][1][0])
    # 使用轴交换进行数组矩阵转置
    m = numpy.arange(9).reshape((3,3))
    print (m)
    print (m.swapaxes(1,0))

    效果:

    该例,就是有关数列或说矩阵的基本运算(数乘运算,转置,点乘等)……

    学习了这些numpy库已经在日常中基本够用,当然它还有很多值得探讨深挖的部分,上述只是冰山一角哦~当然不要忘了多加练习!!

    matplotlib:

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

    在这个强大的库的学习过程中,我得到了一个非常有用的消息:IPython的使用,特别在matplotlib的运用中,这个环境下的表现出乎意料的好!不禁感叹聪明的计算机工程师大触们的才智之高!

    那么如何使用IPython库呢?

    一样用cmd命令行,利用指令"ipython --pylab"就可以调用出IPython环境:

    然后输入代码(从网上copy并稍作修改):

    效果:

    非常nice的效果,直观又美观!matplotlib实在是作图做表神器!

    matplotlib参数设置:

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

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

    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轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。

    作为中国程序员,在面向中国人群体时,我们在制作图表的过程中免不了会使用中文标注,分析等,那要怎么加中文字呢?
    我们会使用:

    import matplotlib.pyplot as plt
    plt.rcParams['font.family']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

    还是刚刚的代码,加了中文的“SimHei”(黑体)显示,可以有下面的表现形式:

    import matplotlib.pyplot as plt
    plt.rcParams['font.family']=['SimHei'] 
    plt.rcParams['axes.unicode_minus']=False 
    labels='青蛙','','狗子','原木'
    sizes=25,20,45,60
    colors='yellowgreen','gold','lightskyblue','lightcoral'
    explode=0,0.2,0,0
    plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.2f%%',shadow=True,startangle=50)
    plt.axis('equal')
    plt.show()

    ok~

    当制作折线图的时候,我们还会运用其他一些功能:

    线条标记及相关属性:

    线条风格linestyle或ls 描述
    '-' 实线
    '—' 破折线
    '-.' 点划线
    ':' 虚线
    'None','','' 什么都不画
    标记masker 描述 标记 描述
    'o' 圆圈 ‘.’
    'D' 菱形 's' 正方形
    'h' 六边形1 '*' 星号
    'H' 六边形2 'd' 小菱形
    '_' 水平线 'v' 一角朝下的三角形
    '8' 八边形 '<' 一角朝左的三角形
    'p' 五边形 '>' 一角朝右的三角形
    ',' 像素 '^' 一角朝上的三角形
    '+' 加号 ' '
    'None','','' 'x' X

    当然还有颜色,背景颜色等参数的设置,具体跟其他常规库别无二致。

    例如:

    通过向如matplotlib.pyplot.axes()或者matplotlib.pyplot.subplot()这样的方法提供一个axisbg参数,可以指定坐标这的背景色。

    subplot(111,axisbg=(0.1843,0.3098,0.3098)

    通过更深入的学习,折线图,条形图,饼图,流程图,梯形图等等你都能制作,结合numpy的数据分析,你能够运用强大的计算分析众多数据,让你更直观地认识,理解眼前的世界!

    (形式丰富的分析图形表格)

     下面是我的实例!!

    成绩雷达图:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib
    plt.rcParams['font.family']='SimHei'
    
    labels=np.array(['总成绩','单选','程序题','剩余用时','复写率'])
    nAttr=5
    data=np.array([7.4,8,6.8,2,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,'iconangle的成绩表',ha='center')
    plt.grid(True)
    plt.savefig('scorce_radar.JPG')
    plt.show()

    效果:

    看上去我的单选似乎更强一点(耸肩)

    进阶地,研究一个物理规律:我选择研究单摆

    伽利略曾对单摆的运动产生浓厚的兴趣,我通过查找单摆的运动公式,得到一个这样的单摆周期计算公式:

    T=2π√(L/g)

     那么利用numpy以及matplotlib可以绘制出这个规律的模型:

    代码如下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rcParams['font.family']='SimHei'
    plt.title("在重力加速度为9.8m/s的时候单摆的周期(T)与摆长(L)关系")
    plt.xlabel('摆长(L)')
    plt.ylabel('周期(T)')
    x=np.linspace(0.0,40.0,1000)
    y=2*np.pi*np.sqrt(x/9.8)
    plt.plot(x,y,'k',color='g',linewidth=3,linestyle='-')
    plt.show()

    效果:

    直观又美观!相当棒!

    那么今天的学习分享就先到这里啦~谢谢关注!!

  • 相关阅读:
    JDBC_增删改
    JSP内置对象作用域
    497. Random Point in Non-overlapping Rectangles
    921. Minimum Add to Make Parentheses Valid
    946. Validate Stack Sequences
    824. Goat Latin
    Acwing 165 小猫爬山 (dfs)
    Codeforces #656 Problem D
    Codeforces #656 Problem C
    对象属性拷贝工具类大全
  • 原文地址:https://www.cnblogs.com/iconangle/p/10741465.html
Copyright © 2011-2022 走看看