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

    一、numpy库简介

      Python标准库中提供了一个array类型,用于保存数组类型的数据,然而这个类型不支持多维数据,不适合数值运算。作为Python的第三方库numpy便有了用武之地。

      numpy库处理的最基础数据类型是用同种元素构成的多维数组(ndarray),简称数组。数组中所有元素的类型必须相同,数组中元素可以用整数索引,序号从0开始。ndarray类型的维度叫作轴(axes),轴的个数叫做秩(rank)。

    二、库函数基本使用

    1. 创建数组的函数 (ndarray类型)

    函数

    说明

    np.array([ x, y, z], dtype = int)

    从列表或数组中创建数组

    np.arange(x, y, i)

    创建一个由x到y,以i为步长的数组

    np.linspace(x, y, n)

    创建一个由x到y,等分成n个元素的数组

    np.indices((m, n))

    创建一个m行n列的矩阵(3维数组)

    np.random.rand(m, n)

    创建一个m行n列的随机数组

    np.ones((m,n), dtype)

    创建一个m行n列的全1数组,dtype为数据类型

    np.zeros((m,n), dtype)

    创建一个m行n列的全0数组,dtype为数据类型

    np.empty((m,n), dtype)

    创建一个m行n列的空数组,dtype为数据类型

    2. ndarray类型的常用属性

    属性

    说明

    ndarray.ndim

    返回数组轴的个数,即数组的秩

    ndarray.shape

    返回数组在每个维度上大小的整数元组

    ndarray.size

    返回数组元素的总个数

    ndarray.dtype

    返回数组元素的数据类型

    ndarray.itemsize

    返回数组元素的字节大小

    ndarray.data

    返回数组元素的缓存区地址

    ndarray.flat

    数组元素的迭代器


     

    3. ndarray类型的形态操作方法

    操作方法

    说明

    ndarray.reshape(n, m)

    返回一个维度为(n, m)的数组副本

    ndarray.resize(new_shape)

    修改数组的维度大小

    ndarray.swapaxes(ax1, ax2)

    调换数组ax1维度与ax2维度,返回调换后的数组

    ndarray.flatten()

    对数组进行降维,返回一维数组

    ndarray.ravel()

    对数组进行降维,返回数组的一个视图


     

    4. ndarray类型的索引与切片方法

    方法

    说明

    x [i]

    索引数组x的第i个元素

    x [-i]

    从后往前索引数组x的第i个元素

    x [n : m]

    从前往后索引数组x,不包含第m个元素

    x [-m : -n]

    从后往前索引数组x,结束位置为n

    x [n : m: i]

    以i为步长索引数组x


     

    5. ndarray类型的算术运算函数

    函数

    说明

    np.add(x1, x2 [,y])

    y = x1 + x2

    np.subtract(x1, x2 [,y])

    y = x1 - x2

    np.multiply(x1, x2 [,y])

    y = x1 * x2

    np.divide(x1, x2 [,y])

    y = x1 / x2

    np.floor_divide(x1, x2 [,y])

    y = x1 // x2

    np.negative(x [,y])

    y = -x

    np.power(x1, x2 [,y])

    y = x1 ** x2

    np.remainder(x1, x2 [,y])

    y = x1 % x2


     

    6. ndarray类型的比较运算函数

    函数

    说明

    np.equal(x1, x2 [,y])

    y = x1 == x2

    np.not_equal(x1, x2 [,y])

    y = x1 != x2

    np.less(x1, x2 [,y])

    y = x1 < x2

    np.less_equal(x1, x2 [,y])

    y = x1 <= x2

    np.greater(x1, x2 [,y])

    y = x1 > x2

    np.greater_equal(x1, x2 [,y])

    y = x1 >= x2

    np.where(condition [x, y])

    根据条件判断输出x或y


     

    7. ndarray类型的其他运算函数

    函数

    说明

    np.abs(x)

    返回数组x每个元素的绝对值

    np.sqrt(x)

    返回数组x每个元素的平方根

    np.square(x)

    返回数组x每个元素的平方

    np.sign(x)

    返回数组x每个元素的符号:1(+)、0、-1(-)

    np.ceil(x)

    返回大于或等于数组x每个元素的最小值

    np.floor(x)

    返回小于或等于数组x每个元素的最大值

    np.rint(x [,out])

    返回数组x每个元素最接近的整数

    np.exp(x [,out])

    返回数组x每个元素的指数值

    np.log(x) / np.log2(x) / np.log10(x)

    返回数组x每个元素相应的对数(e、2、10)

    三、matplotlib库

    简介

    • matplotlib 是提供数据绘图功能的第三方库,其pyplot 子库主要用于实现各种数据展示图形的绘制。
    • matplotlib.pyplot 是matplotlib 的子库,引用方式如下: >>>import matplotlib.pyplot as plt
    • 上述语句与import matplotlib.pyplot 一致,as 保留字与import 一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在后续程序中,plt 将代替matplotlib.pyplot。
    • matplotlib 库由一系列有组织有隶属关系的对象构成,这对于基础绘图操作来说显得过于复杂。因此,matplotlib 提供了一套快捷命令式的绘图接口函数,即pyplot 子模块。pyplot 将绘图所需要的对象构建过程封装在函数中,对用户提供了更加友好的接口。pyplot 模块提供一批预定义的绘图函数,大多数函数可以从函数名辨别它的功能。

    四、1)plt 库的绘图区域函数

    • 使用figure()函数创建一个全局绘图区域,并且使它成为当前的绘图对象,figsize参数可以指定绘图区域的宽度和高度,单位为英寸。鉴于figure()函数参数较多,这里采用指定参数名称的方式输入参数。 >>> plt.figure(figsize=(8,4))
    • subplot()都用于在全局绘图区域内创建子绘图区域,其参数表示将全局绘图区域分成nrows 行和ncols 列,并根据先行后列的计数方式在plot_number 位置生成一个坐标系,实例代码如下,三个参数关系如图10.3 所示。其中,全局绘图区域被风割成3x2 的网格,其中,在第4 个位置绘制了一个坐标系。
    • axes()默认创建一个subplot(111)坐标系,参数rec = [left,bottom,width,height]中四个变量的范围都为[0,1],表示坐标系与全局绘图区域的关系;axisbg 指背景色,默认为white。

    2)plt 库的读取和显示函数

    3)plt 库的基础图表函数

    4)plt 库的基础图表函数

    五、使用numpy、matplotlib模块绘制成绩雷达图

    import numpy as np
    import matplotlib.pyplot as plt

    #标签
    labels = np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])
    #数据个数
    dataLenth = 6
    #数据
    data = np.array([80,100,90,100,110,90])

    angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
    data = np.concatenate((data, [data[0]])) # 闭合
    angles = np.concatenate((angles, [angles[0]])) # 闭合

    fig = plt.figure()
    ax = fig.add_subplot(111, polar=True)# polar参数!!
    ax.plot(angles, data, 'bo-', linewidth=2)# 画线
    ax.fill(angles, data, facecolor='r', alpha=0.55)# 填充
    ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
    ax.set_title("李诗然(学号:2019310143022)成绩雷达图", va='bottom', fontproperties="SimHei")
    ax.set_rlim(0,110)
    ax.grid(True)
    plt.show()

    六、使用PIL、numpy模块绘制自定义手绘风 

    from PIL import Image
    import numpy as np

    a = np.asarray(Image.open("C:\pic.1.jpg").convert('L')).astype('float')

    depth = 10. #(0-100)
    grad = np.gradient(a) #取图像灰度的梯度值
    grad_x, grad_y = grad #分别取横纵图像的梯度值
    grad_x = grad_x*depth/100.
    grad_y = grad_y*depth/100.
    A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
    uni_x = grad_x/A
    uni_y = grad_y/A
    uni_z = 1./A

    vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
    vec_az = np.pi/4. # 光源的方位角度,弧度值
    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 轴的影响

    b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
    b = b.clip(0,255)

    im = Image.fromarray(b.astype('uint8')) #重构图像
    im.save('pic.2.jpg')
    print("图像手绘化已完成")

     七、使用matplotlib绘制sinx,cosx图像

    from matplotlib import pyplot as plt
    import numpy as np
    plt.figure(figsize=(4,2))#生成的图片的大小
    x = np.linspace(-2 * np.pi,2*np.pi,100)#设置一个序列(-2pi,2pi,之间设置100个点)
    y = np.sin(x)#需要绘制的函数
    y1 = np.cos(x)

    plt.ylim(-1,1)#限制y轴的范围
    plt.xlim(-4,4)#x轴的范围

    plt.xlabel("X")#x轴的名称(显示在轴的下边)
    plt.ylabel("Y")#y轴的名称(显示在轴的左边)
    plt.title("sinx cosx ")#图像标题 在图像的上面
    plt.plot(x,y,label="sinx")#根据函数坐标绘制折线图
    plt.plot(x,y1,label = "cosx")#根据函数坐标绘制折线图
    plt.text(1,1,"Text",fontdict={'size':10,'color':'g'})
    plt.annotate('sin(np.pi)=',xy =(-np.pi,0),xytext=(-np.pi,2),fontsize=10,
    arrowprops = dict(facecolor='purple',shrink=0.01))#设置注释
    plt.show()

    p

  • 相关阅读:
    Training: WWW-Robots
    Training: Stegano I
    Encodings: URL
    利用Nginx实现域名转发 不修改主机头
    C++删除目录和复制目录函数
    获取文件大小的函数
    日志打印函数
    拉起上级目录程序
    安卓TabHost页面
    有趣的人形时钟
  • 原文地址:https://www.cnblogs.com/Adaran/p/12839811.html
Copyright © 2011-2022 走看看