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

    一、Numpy 库

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

    引用:

    import numpy as np
    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()

    结果如图:

     

    
    
    
  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/nier2b/p/10793346.html
Copyright © 2011-2022 走看看