• python 科学计算与可视化


    一、Numpy 库

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

    引用:

    import numpy as np

    Numpy简单创建数组:

    import numpy as np
    # 创建简单的列表
    a = [1, 2, 3, 4]
    # 将列表转换为数组
    b = np.array
    (a)

    Numpy查看数组属性:

    数组元素个数:

    b.size

    数组形状:

    b.shape

    数组维度:

    b.ndim

    数组元素类型:

    b.dtype

    快速创建N维数组的api函数:

    (1)创建10行10列的数值为浮点1的矩阵:

    array_one = np.ones([10, 10])

    (2)创建10行10列的数值为浮点0的矩阵:

    array_zero = np.zeros([10, 10])

    Numpy创建随机数组np.random

    • 均匀分布

      • np.random.rand(10, 10)创建指定形状(示例为10行10列)的数组(范围在0至1之间)
      • np.random.uniform(0, 100)创建指定范围内的一个数
      • np.random.randint(0, 100) 创建指定范围内的一个整数
    • 正态分布

      给定均值/标准差/维度的正态分布np.random.normal(1.75, 0.1, (2, 3)

    NumPy 创建数组

    ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。

    numpy.empty

    numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:

    numpy.empty(shape, dtype = float, order = 'C')

    参数说明:

    参数描述
    shape 数组形状
    dtype 数据类型,可选
    order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

     

    numpy.zeros

    创建指定大小的数组,数组元素以 0 来填充:

    numpy.zeros(shape, dtype = float, order = 'C')

    参数说明:

    参数描述
    shape 数组形状
    dtype 数据类型,可选
    order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组

    numpy.ones

    创建指定形状的数组,数组元素以 1 来填充:

    numpy.ones(shape, dtype = None, order = 'C')

    NumPy 从已有的数组创建数组

    numpy.asarray

    numpy.asarray 类似 numpy.array,但 numpy.asarray 只有三个,比 numpy.array 少两个。

    numpy.asarray(a, dtype = None, order = None)

    参数说明:

    参数描述
    a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
    dtype 数据类型,可选
    order 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

    numpy.frombuffer

    numpy.frombuffer 用于实现动态数组。

    numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。

    numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

    注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。

    参数说明:

    参数描述
    buffer 可以是任意对象,会以流的形式读入。
    dtype 返回数组的数据类型,可选
    count 读取的数据数量,默认为-1,读取所有数据。
    offset 读取的起始位置,默认为0。

    numpy.fromiter

    numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。

    numpy.fromiter(iterable, dtype, count=-1)
    参数描述
    iterable 可迭代对象
    dtype 返回数组的数据类型
    count 读取的数据数量,默认为-1,读取所有数据
     

    二、matplotlib库
    matplotlib是python上的一个2D绘图库,它可以在夸平台上边出很多高质量的图像。综旨就是让简单的事变得更简单,让复杂的事变得可能。我们可以用matplotlib生成 绘图、直方图、功率谱、柱状图、误差图、散点图等 。
    引用:
    import matplotlib.pyplot as plt

    散点图:

    plt.scatter(X, Y, s=75, c=T, alpha=.5)

    其中X,Y分别为横纵坐标;s为点的大小(optional);c为颜色设置(optional);alpha为透明度设置(optional),是一个小于等于1的值

    图片附加信息:

    plt.xlim((-1, 1))  #  设置x轴范围为(-1,1)
    plt.ylim((-1, 1))  #  设置y轴范围为(-1,1)
    plt.legend()  # 显示图例
    plt.show()  #  显示绘图

    柱状图:

    x = np.arange(10)
    
    y = 2**x + 10
    
    plt.bar(x,y,facecolor='#9999ff',edgecolor='white')#柱颜色,柱边框颜色
    
    for x,y in zip(x,y):#zip指把x,y结合为一个整体,一次可以读取一个x和一个y
    
        plt.text(x,y,'%.2f' % y,ha='center',va='bottom')#指字体在中间和柱最顶的顶部
    
    plt.show()

    等高图:

    def f(x,y):
    
        #用来生成高度
    
        return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
    
     
    
    x = np.linspace(-3,3,100)
    
    y = np.linspace(-3,3,100)
    
     
    
    X,Y = np.meshgrid(x,y)#将x,y指传入网格中
    
    plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)#8指图中的8+1根线,绘制等温线,其中cmap指颜色
    
     
    
    C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)#colors指等高线颜色
    
    plt.clabel(C,inline=True,fontsize=10)#inline=True指字体在等高线中
    
     
    
    plt.xticks(())
    
    plt.yticks(())
    
    plt.show()

         matplotlib绘制3D图:

    from mpl_toolkits.mplot3d import Axes3D#动态图所需要的包
    
    fig = plt.figure()
    
    ax = Axes3D(fig)
    
     
    
    x = np.arange(-4,4,0.25)#0.25指-4至4间隔为0.25
    
    y = np.arange(-4,4,0.25)
    
    X,Y = np.meshgrid(x,y)#x,y放入网格
    
    R = np.sqrt(X**2 + Y**2)
    
    Z = np.sin(R)
    
     
    
    ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))#rstride=1指x方向和y方向的色块大小
    
    ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')#zdir指映射到z方向,-2代表映射到了z=-2
    
    ax.set_zlim(-2,-2)
    
     
    
    plt.show()

    子图像:

    plt.figure()
    
    plt.subplot(2,2,1)#建立一个两行两列的画布,第一个
    
    plt.plot([0,1],[0,1])
    
    plt.subplot(2,2,2)#第二个
    
    plt.plot([0,1],[0,1])
    
    plt.subplot(2,2,3)#第三个
    
    plt.plot([0,1],[0,1])
    
    plt.subplot(2,2,4)#第四个
    
    plt.plot([0,1],[0,1])
    
    plt.show()

     动态图:
    from matplotlib import animation#动态图所需要的包
    
    fig,ax = plt.subplots()#子图像
    
    x = np.arange(0,2*np.pi,0.01)
    
    line, = ax.plot(x,np.sin(x))
    
     
    
    def animate(i):
    
        line.set_ydata(np.sin(x+i/10))#用来改变的y对应的值
    
        return line,
    
    def init():
    
        line.set_ydata(np.sin(x))#动态图初始图像
    
        return line,
    
     
    
    ani = animation.FuncAnimation(fig=fig,func=animate,init_func=init,interval=20)#动态作图的方法,func动态图函数,init_func初始化函数,interval指图像改变的时间间隔
    
    plt.show()

     三、雷达图

     python123 的成绩雷达图:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    matplotlib.rcParams['font.family']='SimHei'
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    labels = np.array(['第二周', '第三周', '第四周', '第五周', '第六周'])
    nAttr = 5
    data = np.array([90, 90, 100, 100, 90]) #数据值
    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,'bo-',color ='g',linewidth=2)
    plt.fill(angles,data,facecolor='g',alpha=0.25)
    plt.thetagrids(angles*180/np.pi, labels)
    plt.figtext(0.52, 0.95, '广师小帅强的成绩雷达图', ha='center')
    plt.grid(True)
    plt.show()

    运行程序结果如图:

    四、手绘效果

    #e17.1HandDrawPic.py
    from PIL import Image
    import numpy as np
    vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
    vec_az = np.pi/4. # 光源的方位角度,弧度值
    depth = 10. # (0-100)
    im = Image.open('C:\Users\Administrator\Desktop\timg.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) #光源对x 轴的影响
    dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响
    dz = np.sin(vec_el) #光源对z 轴的影响
    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('fcityHandDraw.jpg')

    原图:                                                                                                                                                                手绘效果:          

                                                                                 

    五、数学规律图

    绘制sigmoid函数:

    import matplotlib.pyplot as plt
    
    import numpy as np
    
     
    
     
    
    def sigmoid(x):
    
        # 直接返回sigmoid函数
    
        return 1. / (1. + np.exp(-x))
    
    
    def plot_sigmoid():
    
        # param:起点,终点,间距
    
        x = np.arange(-8, 8, 0.2)
    
        y = sigmoid(x)
    
        plt.plot(x, y)
    
        plt.show()
    if __name__ == '__main__':
    
        plot_sigmoid()

    结果如图:

  • 相关阅读:
    「ROI 2019 Day1」运输 20/19
    「ROI 2018 Day 2」无进位加法
    「ROI 2018 Day 1」量子隐形传态
    「ROI 2018 Day 2」快速排序
    「ROI 2018 Day 1」Innophone (分块+斜率优化)
    「ROI 2017 Day 1」虎 (计算几何)
    [BJ United Round #3] 押韵 [学习笔记]
    「CEOI2020」象棋世界
    CF1375G
    CF1392(div1+div2)
  • 原文地址:https://www.cnblogs.com/guangshixiaoshuaiqiang/p/10749525.html
Copyright © 2020-2023  润新知