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

    一、numpy库的学习总计

    安装numpy
      python3 -m pip install -U pip更新pip
      pip install numpy

    安装方式II
      pip install ipython
      ipython –pylab

      pylab模式下会自动导入SciPy,NumPy,Matplotlib模块

    引入numpy
      import numpy as py

    使用numpy
      arange()函数用于创建同类型多维数组(homogeneous multidimensional array)

      用arange创建的数组使用type()查看类型为ndarray

      reshape()函数用于重新构造数组成为其他维度数组

    例如:np.arange(20).reshape(4,5)

    [[ 0 1 2 3 4]
    [ 5 6 7 8 9]
    [10 11 12 13 14]
    [15 16 17 18 19]]

    arrry  数组相关属性:
    ndim:  维度
    shape:  各维度大小
    size:  元素个数
    dtype:  元素类型
    dsize:  元素占位大小

    生成特殊矩阵
    全零矩阵:np.zeros()

    注意:ones()和zeros()函数的第一个参数是一个指向数列的指针,不能直接是一个数列,例如上图报错情况

    全一矩阵:np.ones(d,dtype=int)
    默认生成浮点型,可通过第二个参数指定元素数据类型

    随机数数组
    np.random.rand(5)生成包含5个[0,1)区间的数的数组

    数组计算
    a = np.array([1.0, 2],[2, 4])
    a
    [[ 1. 2.]
    [ 2. 4.]]
    由于数组是【同质】的,python会自动将整型转换为浮点型

    np.exp(a):自然常数e(约等于2.7)的a次方
    np.sqrt(a):a的开方
    np.square(a):a的平方
    np.power(a,3):a的3次方

    a.sum():所有元素之和

    a.max():最大元素
    a.min():最小元素
    a.max(axis=1):每行最大
    a.min(axis=0):每列最小
    数组与矩阵(matrix)
    注意:
    矩阵是二维数组,矩阵乘法相求左侧矩阵列数等于右侧矩阵行数
    数组可以是任意正整数维数,乘法要求两侧数组行列数均相同
    相互转换
    数组转矩阵
    np.asmatrix(a)
    np.mat(a)

    直接生成
    np.matrix(‘1.0 2.0;3.0 4.0’)


    生成指定长度的一维数组
    np.linspace(0,2,9):生成从0开始,到2结束,包含9个元素的等差数列


    **数组元素访问
    a = np.array([3.2, 1.5],[2.5, 4])
    print a[0][1]
    1.5
    print a[0,1]
    1.5

    注意:
    若b=a是将b和a同时指向同一个array,若修改a或者b的某个元素,a和b都会改变
    若想a和b不会关联修改,则需要b = a.copy()为b单独生成一份拷贝

    a:
    [[ 0 1 2 3 4]
    [ 5 6 7 8 9]
    [10 11 12 13 14]
    [15 16 17 18 19]]

    a[: , [1,3]]:访问a的所有行的2、4列

    **访问符合条件的元素
    a[: , 2][a[: , 0] > 5]

    解释:
    a [x] [y]表示访问符合x、y条件的a的元素,[: , 2]表示取所有行的第3列,[a[: , 0] > 5]表示取第一列大于5的行(即第3、4行),最终即表示取第3、4行的第3列,即得结果array([12, 17])这个“子”数组

    numpy.where()查找符合条件的位置
    例如:loc = np.where(a == 11)
    print loc
    (array([2]), array([1]))

    结果是一个表示坐标的元组,元组第一个数组表示查询结果的行坐标,第二个数组表示结果的列坐标
    print a[loc[0][0], loc[1][0]]
    11

    上式为通过位置反求元素11
    注意:where求出的结果为元组,不能通过loc[x,y]的方式获取元素(该获取方式为数组的方式,因为元组没有索引),只能通过loc[x][y]的方式获取

    数组其他操作
    矩阵转置
    a = np.random.rand(2,4)
    a = np.transpose(a)将a数组转置

    b = np.random.rand(2,4)
    b = np.mat(b)
    print b.T 转置矩阵

    矩阵求逆
    import numpy.linalg as nlg
    a = np.random.rand(2,2)
    a = np.mat(a)
    ia = nlg.inv(a) 得逆矩阵
    print a * ia

    [[ 1. 0.]
    [ 0. 1.]]

    特征值和特征向量
    a = np.random.rand(3,3)
    eig_value, eig_vector = nlg.eig(a)

    拼接矩阵(使用场景:循环处理某些数据后的操作)
    按列拼接两个向量成一个矩阵

    vstack
    hstack

    实例:

    1 a = np.random.rand(2,2) 
    2 b = np.random.rand(2,2) 
    3 c = np.hstack([a,b]) 水平拼接 
    4 d = np.vstack([a,b]) 垂直拼接

    缺失值
    nan作为缺失值的记录
    通过isnan判定
    a = np.random.rand(2,2)
    a[0, 1] = np.nan
    print (np.isnan(a))

    nan_to_num可用来将nan替换成0
    pandas提供能指定nan替换值的函数

    print(np.nan_to_num(a))
    [[ 0.54266589 0.46546544 ]
    [ 0.92468339 0.70599254]]
    matplotlib的学习总结

    实例1:基本三角函数图像实现

    1 import numpy as np  
    2 import matplotlib.pyplot as plt
    3 x = np.linspace(0, 6, 100)
    4 y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8
    5 plt.plot(x, y, 'k', color='r', linewidth=3, linestyle="-")
    6 plt.show()

    复制代码
    复制代码
     1 import matplotlib.pyplot as plt
     2 import matplotlib
     3 matplotlib.rcParams['font.family']='SimHei'
     4 matplotlib.rcParams['font.sans-serif'] = ['SimHei']
     5 plt.plot([1,2,4], [1,2,3])
     6 plt.title("坐标系标题")
     7 plt.xlabel('时间 (s)')
     8 plt.ylabel('范围 (m)')
     9 plt.xticks([1,2,3,4,5],[r'$pi/3$', r'$2pi/3$', r'$pi$',
    10                    r'$4pi/3$', r'$5pi/3$'])
    11 plt.show()
    复制代码
    复制代码

    实例2:带标识的坐标系

    复制代码
    复制代码
     1 import matplotlib.pyplot as plt
     2 import numpy as np
     3 x = np.linspace(0, 10, 1000)
     4 y = np.cos(2*np.pi*x) * np.exp(-x)+0.8
     5 plt.plot(x,y,'k',color='r',label="$exp-decay$",linewidth=3)
     6 plt.axis([0,6,0,1.8])
     7 ix = (x>0.8) & (x<3)
     8 plt.fill_between(x, y ,0, where = ix, 
     9                          facecolor='grey', alpha=0.25)
    10 plt.text(0.5*(0.8+3), 0.2, r"$int_a^b f(x)mathrm{d}x$",
    11                 horizontalalignment='center')
    12 plt.legend()
    13 plt.show()
    复制代码
    复制代码

    实例3:带阴影的坐标系

    实例4:带阻尼衰减曲线坐标图绘制

    复制代码
    复制代码
     1 ##e18.1PlotDamping.py
     2 import numpy as np
     3 import matplotlib.pyplot as plt
     4 import matplotlib
     5 matplotlib.rcParams['font.family']='SimHei'
     6 matplotlib.rcParams['font.sans-serif'] = ['SimHei']
     7 def Draw(pcolor, nt_point, nt_text, nt_size):
     8     plt.plot(x, y, 'k', label="$exp_decay$", color=pcolor, linewidth=3, linestyle="-")
     9     plt.plot(x, z, "b--", label="$cos(x^2)$", linewidth=1)
    10     plt.xlabel('时间(s)')
    11     plt.ylabel('幅度(mV)')
    12     plt.title("阻尼衰减曲线绘制")
    13     plt.annotate('$cos(2 pi t) exp(-t)$', xy=nt_point, xytext=nt_text, fontsize=nt_size,
    14                arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.1"))
    15 def Shadow(a, b):
    16     ix = (x>a) & (x<b)
    17     plt.fill_between(x,y,0,where=ix,facecolor='grey', alpha=0.25)
    18     plt.text(0.5 * (a + b), 0.2, "$int_a^b f(x)mathrm{d}x$", 
    19              horizontalalignment='center')
    20 def XY_Axis(x_start, x_end, y_start, y_end):
    21     plt.xlim(x_start, x_end)
    22     plt.ylim(y_start, y_end)
    23     plt.xticks([np.pi/3, 2 * np.pi/3, 1 * np.pi, 4 * np.pi/3, 5 * np.pi/3], 
    24                ['$pi/3$', '$2pi/3$', '$pi$', '$4pi/3$', '$5pi/3$'])
    25 x = np.linspace(0.0, 6.0, 100)
    26 y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8
    27 z = 0.5 * np.cos(x ** 2)+0.8
    28 note_point,note_text,note_size = (1, np.cos(2 * np.pi) * np.exp(-1)+0.8),(1, 1.4), 14
    29 fig = plt.figure(figsize=(8, 6), facecolor="white")
    30 plt.subplot(111)
    31 Draw("red", note_point, note_text, note_size)
    32 XY_Axis(0, 5, 0, 1.8)
    33 Shadow(0.8, 3)
    34 plt.legend()
    35 plt.savefig('sample.JPG')
    36 plt.show()
    复制代码
    复制代码

     实例五多级雷达图绘制
    lol人物能力值雷达图绘制

     代码如下:

    复制代码
     1 # -*- coding: utf-8 -*-
     2 ##e19.1DrawRadar
     3 import numpy as np
     4 import matplotlib.pyplot as plt
     5 import matplotlib
     6 matplotlib.rcParams['font.family']='SimHei'
     7 matplotlib.rcParams['font.sans-serif'] = ['SimHei']
     8 labels = np.array(['KDA', '综合', '生存', '发育', '输出', '推塔'])
     9 nAttr = 6
    10 data = np.array([8, 2, 7, 6, 4, 9]) #数据值
    11 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
    12 data = np.concatenate((data, [data[0]]))
    13 angles = np.concatenate((angles, [angles[0]]))
    14 fig = plt.figure(facecolor="white")
    15 plt.subplot(111, polar=True)
    16 plt.plot(angles,data,'bo-',color ='g',linewidth=2)
    17 plt.fill(angles,data,facecolor='y',alpha=0.25)
    18 plt.thetagrids(angles*180/np.pi, labels)
    19 plt.figtext(0.52, 0.95, 'lol能力值雷达图', ha='center')
    20 plt.grid(True)
    21 plt.show()
    复制代码

    效果图如下:

    实例6:霍兰德人格分析雷达图绘制

    复制代码
     1 #e19.2DrawHollandRadar
     2 import numpy as np
     3 import matplotlib.pyplot as plt
     4 import matplotlib
     5 matplotlib.rcParams['font.family']='SimHei'
     6 matplotlib.rcParams['font.sans-serif'] = ['SimHei']
     7 radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)','企业型(E)','常规型(C)','现实型(R)'])
     8 nAttr = 6
     9 data = np.array([[0.63, 0.42, 0.35, 0.30, 0.30, 0.45],
    10                  [0.46, 0.65, 0.30, 0.60, 0.40, 0.55],
    11                  [0.49, 0.89, 0.35, 0.80, 0.72, 0.87],
    12                  [0.35, 0.35, 0.37, 0.55, 0.87, 0.32],
    13                  [0.34, 0.98, 0.89, 0.65, 0.42, 0.31],
    14                  [0.88, 0.31, 0.48, 0.64, 0.82, 0.31]]) #数据值
    15 data_labels = ('工程师', '实验员', '艺术家', '推销员', '社会工作者','记事员')
    16 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
    17 data = np.concatenate((data, [data[0]]))
    18 angles = np.concatenate((angles, [angles[0]]))
    19 fig = plt.figure(facecolor="white")
    20 plt.subplot(111, polar=True)
    21 #plt.plot(angles,data,'bo-',color ='gray',linewidth=1,alpha=0.2)
    22 plt.plot(angles,data,'o-', linewidth=1.5, alpha=0.2)
    23 plt.fill(angles,data, alpha=0.25)
    24 plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2)
    25 plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
    26 legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
    27 plt.setp(legend.get_texts(), fontsize='small')
    28 plt.grid(True)
    29 plt.show()
    复制代码

     效果图如下所示:

    四、自定义手绘风

    代码如下:

    复制代码
     1 #e17.1HandDrawPic.py
     2 from PIL import Image
     3 import numpy as np
     4 vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
     5 vec_az = np.pi/4. # 光源的方位角度,弧度值
     6 depth = 10. # (0-100)
     7 im = Image.open('E:\111.jpeg').convert('L')
     8 a = np.asarray(im).astype('float')
     9 grad = np.gradient(a) #取图像灰度的梯度值
    10 grad_x, grad_y = grad #分别取横纵图像梯度值
    11 grad_x = grad_x*depth/100.
    12 grad_y = grad_y*depth/100.
    13 dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响
    14 dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响
    15 dz = np.sin(vec_el) #光源对z 轴的影响
    16 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
    17 uni_x = grad_x/A
    18 uni_y = grad_y/A
    19 uni_z = 1./A
    20 a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
    21 a2 = a2.clip(0,255)
    22 im2 = Image.fromarray(a2.astype('uint8')) #重构图像
    23 im2.save('E:\11.jpeg')
    复制代码

     原图:

    效果图:

     

    五、自己的成绩分析雷达图

    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([20,20,20,20,20]) #数据值
    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()

    效果图:

  • 相关阅读:
    android界面横屏和竖屏的切换
    google 提供webrtc 的实例使用 turnserver的方式
    如何使官方提供的AppRTCDemo 运行在自己搭建的server(官方提供的apprtc)上(官方的server源码)
    android在全屏下第一次触摸屏幕没有触发事件
    ubuntu常用命令记录集
    python 一个包中的文件调用另外一个包文件 实例
    python-插入排序
    phantomjs submit click
    python socket.error: [Errno 10054] 解决方法
    python-快速排序,两种方法→易理解
  • 原文地址:https://www.cnblogs.com/wangxinyu520/p/10766367.html
Copyright © 2011-2022 走看看