• scipy.sparse.lil_matrix


    scipy.sparse.lil_matrix

    class scipy.sparse.lil_matrix(arg1, shape=None, dtype=None, copy=False)

    Row-based LIst of Lists sparse matrix.

    This is a structure for constructing sparse matrices incrementally. Note that inserting a single item can take linear time in the worst case; to construct the matrix efficiently, make sure the items are pre-sorted by index, per row.

    See https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html

    一些测试

    # -*- coding: utf-8 -*-
    import numpy as np
    from scipy.sparse import csr_matrix, lil_matrix
    from scipy.sparse.linalg import spsolve
    import scipy.sparse as sp
    import scipy.linalg as la
    
    def Compute_Row_Index(indptr):
        row=len(indptr)-1
        l=indptr[1]-indptr[0]
        z=np.zeros(l)
        a=list(z)#行索引,计算如下
        for i in range(1,row):
            l=indptr[i+1]-indptr[i]
            z=np.ones(l)
            a=a+list(z*i)
        a=np.array(a,dtype=np.int64)
        return a
    # 创建一个稀疏矩阵
    data = np.array([1, 2, 3, 4, 5, 6])
    indices = np.array([0, 2, 2, 0, 1, 2])
    indptr = np.array([0, 2, 3, 6])
     
    # 将数据转换为CSR格式
    A = csr_matrix((data, indices, indptr), shape=(3, 3))
    
    # 访问CSR格式的属性
    print("CSR格式的数据:", A.data)
    print("CSR格式的列索引:", A.indices)
    print("CSR格式的行指针:", A.indptr)
    #print(A.todense())
    
    data = np.array([1, 2, 3, 4, 5, 6])
    indices = np.array([0, 1, 2, 0, 1, 2])
    indptr = np.array([0, 1, 3, 6])
     
    # 将数据转换为CSR格式
    A2 = csr_matrix((data, indices, indptr), shape=(3, 3))
    print(A2.todense())
    
    
    #%%
    # 创建一个CSR矩阵
    row_ind = np.array([0, 0, 1, 2, 2, 2])
    col_ind = np.array([0, 2, 2, 0, 1, 2])
    data = np.array([1, 1, 1, 2, 2, 2])
    A1 = csr_matrix((data, (row_ind, col_ind)), shape=(3, 3))
    A0 = lil_matrix((3, 3))
    A00 = lil_matrix((3, 3))
    #row_ind1=Compute_Row_Index(A1.indptr)
    A0[row_ind,col_ind]=data
    print('+++++++++')
    print(A0.rows)
    print(A0.rows[0])
    #A00[A0.rows]=A0.data
    #print(A1.data)
    #print(A1.tocsr())
    print(A1.todense())
    print(A0.todense())
    #这里生成矩阵A的方式和前面不一样,这应该是COO存储方式
    # 创建右侧向量
    b = np.array([1, 1, 1])
    
    # 使用spsolve求解方程组Ax = b
    #x = spsolve(A.tocsr(), b)
    x1 = spsolve(A1, b)
    x0 = spsolve(csr_matrix(A0), b)
    print("解向量x:")
    print(x1)
    print(x0)
    print('两个csr矩阵是否可以相加')
    print((A2+A1).todense())
    
    # 打印结果
    
    
    N = 5
    A = sp.diags([1, -2, 1], [1, 0, -1], shape=[N, N], format='csc')
    b = -np.ones(N)
    x = sp.linalg.spsolve(A, b)
    print("解向量x:", x)
    B = A.todense()#为了对比,我们也使用SciPy提供的稠密矩阵求解器:
    x = la.solve(B, b)#上了一万的矩阵储存直接不够,且求解非常慢
    print("解向量x:", x)
    
    from scipy.sparse import diags
     
    # 假设我们有两个对角线上的1d数组
    diag1 = np.array([1, 2, 3, 4])
    diag2 = np.array([5, 6, 7, 8])
     
    # 创建稀疏对角分块矩阵
    # 这里的-1和1分别表示主对角线下方和上方
    # 参数(offsets, data, shape, format, dtype)
    A = diags([diag1, diag2], [-1, 1], shape=(len(diag1)+1, len(diag1)+1), format='csr', dtype=np.int32)
     
    # 打印矩阵
    print(A.toarray())
    
    from scipy.sparse import csr_matrix
    # 定义矩阵大小N
    N = 4
    # 创建一个NxN的稀疏矩阵,初始为全零
    sparse_matrix = csr_matrix((N, N), dtype=float).toarray()
    '''
    这段代码首先导入了csr_matrix类,然后定义了矩阵的大小N。接着,
    它创建了一个NxN的矩阵,初始化为全零,并通过调用toarray()将稀疏矩阵
    转换为普通的二维数组,最后打印出这个矩阵。
    如果你不想将稀疏矩阵转换为普通数组,而是想保持稀疏矩阵的结构,
    你可以直接操作稀疏矩阵。在稀疏矩阵中,非零元素通常被存储为
    一组三元组(row, column, value),这些三元组可以直接用来构造稀疏矩阵。
    # 打印矩阵
    '''
    print('申请一个空数组')
    print(sparse_matrix)
    
     
    # 创建一个空的csr_matrix
    row = np.array([0, 0, 1, 2, 2])
    col = np.array([0, 2, 2, 0, 1])
    data = np.array([1, 2, 3, 4, 5])
    shape = (3, 3)
     
    csr_mat = csr_matrix((data, (row, col)), shape=shape)
    print(csr_mat.toarray())
    # 通过索引给特定位置赋值
    csr_mat.data[0]= 6
     
    # 使用update方法给特定行或列赋值
    new_data = np.array([7, 8, 9])
    #csr_mat.set_value(new_data, (0, slice(None)))  # 赋值给第一行
     
    print(csr_mat.toarray())
    
    
    #python 给csr_matrix添加元素
    # 假设我们已经有了一个csr_matrix
    A = csr_matrix((3, 3), dtype=int)#创建一个3x3的0元素矩阵
    # 添加单个元素
    row = 1
    col = 1
    value = 5
     
    # 创建一个新的矩阵,它将是A和新元素的合并
    B = csr_matrix(([value], ([row], [col])), shape=A.shape)
     
    # 合并两个矩阵
    A = A + B
     
    print(A.toarray())  # 转换为普通数组以便打印
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    import numpy as np
    from scipy.sparse import csr_matrix, lil_matrix
    from scipy.sparse.linalg import spsolve
    import scipy.sparse as sp
    import scipy.linalg as la
     
    # Create sparse matrix.
    graph = csr_matrix((6, 6))
    # Change sparse matrix.
    #graph[(1, 1)] = 1      # --- SLOW --- ^1
    # Do some calculations.
    #graph += graph
    print(graph.todense())
    
    
    #修改csr_matrix中元素的值,如果直接使用上面的方式会出现警告
    #根据https://stackoverflow.com/questions/38241386/what-is-the-correct-way-to-add-elements-to-a-csr-matrix
    #采用先定义lil_matrix,修改其值再转化为csr_matrix
    # Create sparse matrix.
    graph = lil_matrix((10, 10))
    # Change sparse matrix.
    graph[(1, 1)] = 1
    graph[(2, 1),(4, 3)] = [2,3]
    L=np.array([3,4,5],dtype=np.int64)
    graph[(L,L)] = [6,7,8]
    graph[8, 8] = 2
    graph[8, 8]=graph[8, 8]+3
    # Done with changes to graph. Convert to csr.
    graph = csr_matrix(graph)
    print(graph.todense())
    # Do some calculations.
    graph += graph
    
    ##
    indptr=[0,2,5,7]#列索引
    
    row=len(indptr)-1
    a=[]#行索引,计算如下
    for i in range(0,row):
        if(i==0):
            l=indptr[i+1]-indptr[i]
            z=np.zeros(l)
            a=a+list(z)
        else:
            l=indptr[i+1]-indptr[i]
            z=np.ones(l)
            a=a+list(z*i)
    a=np.array(a,dtype=np.int64)
    print(a)
    #%%    
    indices=[1,3,0,1,3,0,2]
    data=[1,2,1,1,2,2,5]
    #创建稀疏矩阵的方式一
    B=csr_matrix((data, indices, indptr))
    print(B.toarray())
    #创建稀疏矩阵的方式二
    #C=csr_matrix((data, (a,indices)), shape=(3, 4))
    C=csr_matrix((data, (a,indices)))
    print(C.toarray())
    
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
  • 相关阅读:
    10 创建型模式-原型模式
    3-9DNS特殊解析
    CSDN开发云产品功能体验
    2023年09月IDE流行度最新排名
    【目标检测】SSD损失函数详解
    使用GIt小组分工完成积分商城系统-SSM
    操作系统学习笔记3-同步互斥问题
    安卓登录密码验证大小写字母数字和特殊符号
    SimSiam:Exploring Simple Siamese Representation Learning
    日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明
  • 原文地址:https://blog.csdn.net/y15520833229/article/details/138114716