• Python学习(四)数组和矩阵


    参考资料:

    https://github.com/lijin-THU/notes-python(相应实体书为:《自学Python——编程基础、科学计算及数据分析》)

    一、生成数组的函数

    1. arange()函数:类似于python中的range()函数,只不过返回的不是列表,而是返回数组

    (1)arange(start, stop=None, step=1, dtype=None)  //产生一个在区间 [start, stop) 之间(不包括stop),以 step 为间隔的数组,如果只输入一个参数,则默认从 0 开始,并以这个值为结束,数组类型由dtype指定

    (2)与 range 不同, arange 允许非整数值输入,产生一个非整型的数组:np.arange(0, 2 * np.pi, np.pi / 4) 或 np.arange(0, 2 * np.pi, np.pi / 4, dtype=np.float32)

    注:由于存在精度问题,使用浮点数可能出现问题,如 np.arange(1.5, 2.1, 0.3) 返回 array([1.5, 1.8, 2.1])  终点stop的值2.1出现在数组中

    2. linspace()函数:linspace(start, stop, N)  产生 N 个等距分布在 [start, stop]间的元素组成的数组,包括 start, stop

    3. logspace()函数:logspace(start, stop, N)  产生 N 个对数等距分布的数组,默认以10为底

    np.logspace(0, 1, 5)  //产生的值为$[10^{0}, 10^{0.25}, 10^{0.5}, 10^{0.75}, 10^{1}]$

    4. meshgrid()函数:在二维平面生成网格

    1 x_ticks = np.linspace(-1, 1, 5)
    2 y_ticks = np.linspace(-1, 1, 5)
    3 
    4 x, y = np.meshgrid(x_ticks, y_ticks)
    x: array([[-1. , -0.5, 0. , 0.5, 1. ],
           [-1. , -0.5,  0. ,  0.5,  1. ],
           [-1. , -0.5,  0. ,  0.5,  1. ],
           [-1. , -0.5,  0. ,  0.5,  1. ],
           [-1. , -0.5,  0. ,  0.5,  1. ]])
    y: array([[-1. , -1. , -1. , -1. , -1. ],
           [-0.5, -0.5, -0.5, -0.5, -0.5],
           [ 0. ,  0. ,  0. ,  0. ,  0. ],
           [ 0.5,  0.5,  0.5,  0.5,  0.5],
           [ 1. ,  1. ,  1. ,  1. ,  1. ]])

     注:可以添加 sparse 的选项以避免冗余,x, y = np.meshgrid(x_ticks, y_ticks, sparse=True)  //生成的x、y分别为单一的行向量和列向量

    (1)meshgrid 可以设置轴排列的先后顺序:

    • 默认为 indexing='xy' 即笛卡尔坐标,对于2维数组,返回行向量 x 和列向量 y
    • 或者使用 indexing='ij' 即矩阵坐标,对于2维数组,返回列向量 x 和行向量 y

    (2)matlab中meshgrid用法有:meshgrid(-1:.5,1, -1:.5:1);相应的, 在numpy中使用ogrid和mgrid函数

    ogrid 与 mgrid 的区别在于:

    • ogrid 相当于 meshgrid(indexing='ij', sparse=True)
    • mgrid 相当于 meshgrid(indexing='ij', sparse=False)

    注:

    • 这里使用的是中括号
    • Matlab 使用的是 start:step:end 的表示,Numpy 使用的是 start:end:step 的表示
    • 这里的结果不包括 end 的值

    为了包含 end 的值,可以使用这样的技巧:

    x, y = np.ogrid[-1:1:5j, -1:1:5j]  //在 step 的位置传入一个复数 5j ,表示需要一个 5 个值的数组,此时返回值就会包含 end 的值(复数步长指定数组长度

    5. 使用 r_ / c_ 来产生行向量或者列向量

    1 np.r_[0:1:.1]  #使用切片产生行向量
    2 np.r_[0:1:5j]  #使用复数步长指定数组长度
    3 np.r_[(3,22,11), 4.0, [15, 6]]  #连接多个序列
    4 np.r_[(3,22,11), 4.0, [15, 6]]  #列向量

    6. 产生全0和全1数组:ones(shape, dtype=float64)、zeros(shape, dtype=float64)

    1 np.zeros(3)
    2 np.ones([2,3], dtype=np.float32)
    3 np.ones([2,3]) * 5  #产生全是5的数组

    7. empty()函数:empty(shape, dtype=float64,  order='C')

    可以使用 empty 方法产生一个指定大小的数组(数组所指向的内存未被初始化,值随机),再用 fill 方法填充

    1 a = np.empty(2)
    2 a.fill(5)
    3 a[:] = 5  #使用索引方法,速度稍慢一点

    8. empty_like(a)、ones_like(a)、zeros_like(a):产生一个跟 a 大小一样,类型一样的对应数组

    9. identity(n, dtype=float64):产生一个 n 乘 n 的单位矩阵,如 identity(3)

    二、矩阵 

    1. 使用 mat 方法将2维数组转化为矩阵

    1 import numpy as np
    2 a = np.array([[1,2,4],
    3               [2,5,3], 
    4               [7,8,9]])
    5 A = np.mat(a)  #type(A)

    2. 使用 Matlab 的语法传入一个字符串来生成矩阵

    1 A = np.mat('1,2,4;2,5,3;7,8,9')

    3. 利用分块创造新的矩阵

    1 a = np.array([[ 1, 2],
    2               [ 3, 4]])
    3 b = np.array([[10,20], 
    4               [30,40]])
    5 
    6 np.bmat('a,b;b,a')

    4. 矩阵与向量乘法、逆矩阵、矩阵连乘

    1 A = np.mat('1,2,4;2,5,3;7,8,9')
    2 x = np.array([[1], [2], [3]])
    3 A * x  #矩阵与向量乘法
    4 print(A * A.I)  #A.I表示矩阵A的逆矩阵
    5 print A ** 4  #矩阵指数表示矩阵连乘
  • 相关阅读:
    jieba的使用
    如何用python查看自己的电脑有几个核
    NLTK实现文本切分
    nltk的安装和简单使用
    初识NLP 自然语言处理
    mysql 查询存在A表中而不存在B表中的数据
    mysql 导出数据报错: row must be in range 0-65535
    python3 re模块正则匹配字符串中的时间信息
    Python语法速查: 14. 测试与调优
    Python语法速查: 20. 线程与并发
  • 原文地址:https://www.cnblogs.com/hg-love-dfc/p/10287034.html
Copyright © 2020-2023  润新知