• 【python数据建模】Numpy库


    数组

    创建

    import numpy as np
    # np.array() 生成元素同类型的数组
    a1=np.array([1,2,3,4]) # 整型
    a2=np.array([1.0,2,3,4]) # 浮点型
    a3=np.array([1,2,3,4],dtype=float)
    a4=np.array(['1',2,3,4]) # 字符串
    
    # np.astype() 数值类型转换
    a=a4.astype(int)
    print(a.dtype)
    
    # np.arange(start,stop,step,dtype) 
    # 生成[start,stop)区间上步长为step,类型为dtype的等差数组
    b1=np.arange(1,4)
    b2=np.arange(0,10,2)
    
    # np.linspace(start,stop,num=50,endpoint=True)
    # 生成区间[start,stop]区间上间隔相等的num个数据的等差数组,默认包含区间终点
    c1=np.linspace(0,100)
    c2=np.linspace(0,10,num=3,endpoint=False)
    
    # np.logspace(start,stop,num=50,endpoint=True,base=10.0)
    # 默认生成区间[10^start,10^stop]上的num个数据的等比数列
    d1=np.logspace(0,1)
    d2=np.logspace(0,8,num=3,base=2,dtype=int)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    创建特定数组

    import numpy as np
    
    # np.ones(shape,dtype=None,order='C') 生成元素全为1的矩阵
    # order:C 行优先,F:列优先
    a1=np.ones((2,3),dtype=int)
    a2=np.ones((3,4),dtype=[('x','int'),('y','float')])
    
    # np.zeros(shape,dtype=float,order='C') 生成元素全为0的矩阵
    b=np.zeros((3,2),dtype=int)
    
    # np.empty(shape,dtype=float,order='C') 生成给定维度、数值类型以及存储顺序的未初始化(任意值)的数组。
    c=np.empty((2,3))
    
    # np.eye(N, M=None, k=0, dtype=) 2维数组,单位矩阵
    # 不输入参数M的时候默认等于N
    # k:对角线索引,0为主对角线,正值为对角线上移,负值为对角线下移
    d1=np.eye(3)
    d2=np.eye(2,3)
    d3=np.eye(3,k=2)
    
    # np.zeros_like(a,dtype=None) 生成一个与给定数组a同规模和类型的零数组
    c1=np.zeros_like(d1)
    c2=np.zeros_like(d1,dtype=int)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    索引

    除了类似二维列表的索引a[i][j],还可以用a[i,j]的形式索引,同样可以类似列表使用切片等操作。Numpy数组的索引还可以和整数数组结合使用,以及进行布尔值索引。

    1 整数数组索引

    import numpy as np
    a=np.arange(0,16).reshape(4,4)
    """
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]]
    """
    ind=[0,1,2]
    print(a[ind]) # 索引前3行
    """
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
     """
    print(a[ind,ind]) # 索引前3行主对角线元素
    """
    [ 0  5 10]
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2 布尔值索引

    可以给出筛选条件,然后通过索引

    import numpy as np
    
    # 布尔值索引
    a=np.arange(0,16).reshape(4,4)
    b=a<=5
    """
    [[ True  True  True  True]
     [ True  True False False]
     [False False False False]
     [False False False False]]
    """
    print(a[b])
    """
    [0 1 2 3 4 5]
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    合并与分解

    函数说明
    hstack按水平顺序重新堆叠排序两个数组
    vstack按垂直顺序重新堆叠排序两个数组

    线性代数运算 linalg模块

    基本运算

    函数说明
    kronK积
    matmul矩阵乘法
    dot向量作内积,矩阵作乘法
    inner数组作内积,返回nd数组类型

    分解

    函数说明
    qr矩阵的QR分解
    svd奇异值分解
    choleskyCholesky分解,常出现在最小二乘法

    线代上一些常见的矩阵分解可以见本人自己写的一篇公众号推文:常见的几种矩阵分解
    以下只做简单描述和范例展示。

    QR分解

    通常是把可逆矩阵分解为正交矩阵和对角线元素都为正数的上三角矩阵的乘积。
    是对线性无关向量组进行施密特正交单位化的矩阵表达。

    import numpy as np
    import numpy.linalg as nl
    
    a = np.array([[1,1,0,0],
                  [1,0,1,0],
                  [-1,0,0,1],
                  [1,-1,-1,1]])
    
    Q,R= nl.qr(a)
    print(np.matmul(Q,R)) # 验证
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    奇异值分解

    对于可逆矩阵A,存在正交矩阵 Q 1 , Q 2 Q_1,Q_2 Q1,Q2使得 Q 1 A Q 2 Q_1AQ_2 Q1AQ2为对角矩阵,主对角元为 λ i \lambda_i λi满足 λ i 2 \lambda_i^2 λi2 A A T AA^T AAT的全部特征根。
    对于不可逆以及非方阵同样如此,但是“对角线”上可能会有0元。

    import numpy as np
    import numpy.linalg as nl
    
    a = np.array([[1,1,1],
                  [-1,0,1],
                  [0,-1,1]])
    
    U,S,vh= nl.svd(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Cholesky分解

    是针对正定矩阵的分解,即正定矩阵可以分解为下三角矩阵与其转置矩阵的乘积。

    import numpy as np
    import numpy.linalg as nl
    
    a = np.array([[4, 12, -16],
                  [12, 37, -43],
                  [-16, -43, 98]])
    
    L = nl.cholesky(a)
    print(L)
    """
    [[ 2.  0.  0.]
     [ 6.  1.  0.]
     [-8.  5.  3.]]
    """
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    特征值

    函数说明
    eig计算方阵的特征值和右特征向量
    eigh返回埃尔米特矩阵或实对称矩阵的特征值和特征向量
    eigvalsh计算复杂的埃尔米特矩阵或实对称矩阵的特征值
    import numpy as np
    import numpy.linalg as nl
    # eig
    eigenvalues, eigenvectors = nl.eig(np.diag((1, 2, 3)))
    
    • 1
    • 2
    • 3
    • 4

    范数和其他

    函数说明
    norm矩阵或向量范数
    det矩阵行列式
    matrix_rank使用svd方法返回矩阵的秩
    trace数组对角线的和/矩阵的迹

    解方程和逆矩阵

    广义逆的定义和性质可以参考《高等代数》(丘维声)相关章节

    函数说明
    solve求解线性方程组,只能求有唯一解的方程组
    lstsq返回线性方程的最小二乘解
    inv矩阵求逆
    pinv矩阵求广义逆
    import numpy as np
    import numpy.linalg as nl
    # solve
    a = np.array([[1,2,1],[0,1,0],[0,0,1]])
    b = np.array([1,0,0])
    x=nl.solve(a,b)
    # inv
    a=np.array([[1,2,1],[0,1,0],[0,0,1]])
    b=nl.inv(a)
    # pinv
    a=np.array([[1,2,1],[0,1,0]])
    b=nl.pinv(a)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    TCP/IP--MAC地址详解——保证你能看懂
    【音视频】AAC音频压缩格式
    机器学习策略篇:详解如何改善你的模型的表现(Improving your model performance)
    CSS样式
    C++语法2
    Linux中安装jdk、tomcat、mysql
    学术研究和论文写作
    3款软件分享,感兴趣的快快码住呀
    蓝桥杯练习系统(算法训练)ALGO-982 最小距离
    如何调整 Kubernetes StatefulSet 卷的大小
  • 原文地址:https://blog.csdn.net/Yorusimo/article/details/133437523