Python 如何避免稀疏矩阵的循环?

Python 如何避免稀疏矩阵的循环?,python,numpy,sparse-matrix,Python,Numpy,Sparse Matrix,我在Python中遇到了3个循环的问题。 此代码的目的是根据数据的(x)个未知值计算稀疏矩阵。这里,x数是13,这意味着数据的未重复值:(0、4、8、12、16、20、21、22、23、24、25、26、27)。然后,len(DATA)是4,表示_稀疏矩阵的行数。然后,我创建形状为(4,13)的稀疏零矩阵。然后,如果x等于未知值,我将部分值取为A_稀疏 问题 这段代码工作正常,但有循环!!!我应该删除循环,但是 怎么做 在这里,我举个例子如下: 输入: 数据-表示索引;[24,20,21,

我在Python中遇到了3个循环的问题。 此代码的目的是根据数据的(x)个未知值计算稀疏矩阵。这里,x数是13,这意味着数据的未重复值:(0、4、8、12、16、20、21、22、23、24、25、26、27)。然后,len(DATA)是4,表示_稀疏矩阵的行数。然后,我创建形状为(4,13)的稀疏零矩阵。然后,如果x等于未知值,我将部分值取为A_稀疏

问题

  • 这段代码工作正常,但有循环!!!我应该删除循环,但是 怎么做
在这里,我举个例子如下:

输入:

  • 数据-表示索引;[24,20,21,22,23],[24,25,26,27],[25,26,27,23],[0,4,8,12,16,20]]
  • 部分-[[1.16950604,0.08724138,1.5326188,1.5326188,0.74587448], [ 0.44409055, 1.51394507, 1.51394507, 0.95883188], [ 0.77097384, 1.77917041, 0.14615981, 0.185952 ], [0.93,1.5,1.5,1.5,1.5,0.07]]
输出: -A_稀疏-稀疏矩阵

def get_sparse(DATA, PORTION):

    x = np.unique( flatten(DATA) )
    A = np.zeros((len(DATA), len(x)))

    for i in range(len(DATA)):
        for m1,m2 in enumerate(DATA[i]):
            for j,k in enumerate(x):
                    if float(m2) == float(k):
                            A[i][j] = PORTION[i][m1]
    return A


>>> get_sparse(DATA, PORTION)
array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
     0.08724138,  1.5326188 ,  1.5326188 ,  0.74587448,  1.16950604,
     0.        ,  0.        ,  0.        ],
   [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
     0.        ,  0.        ,  0.        ,  0.        ,  0.44409055,
     1.51394507,  1.51394507,  0.95883188],
   [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
     0.        ,  0.        ,  0.        ,  0.185952  ,  0.        ,
     0.77097384,  1.77917041,  0.14615981],
   [ 0.93      ,  1.5       ,  1.5       ,  1.5       ,  1.5       ,
     0.07      ,  0.        ,  0.        ,  0.        ,  0.        ,
     0.        ,  0.        ,  0.        ]])
当我使用Python时,我通常不喜欢使用循环,因此,我想删除循环以使代码更短更快。
任何答复都将不胜感激

鉴于数据和部分的不规则列表性质,这个问题的numpy向量化并不明显。但是,如果我打印
get\u sparse(数据,数据)
,它可以帮助我可视化构造函数:

这些看起来像是常规的列号,除了第一个是4。此版本的函数构建一个(4,28)数组,然后修剪
zero

def get_sparse(DATA, PORTION):
    x = np.unique(itertools.chain(*DATA) )
    A = np.zeros((len(DATA), max(x)+1))
    for a, d, p in zip(A, DATA, PORTION):
        a[d] = p
    return A[:,x]
要使用稀疏矩阵,请尝试:

from scipy import sparse
A = sparse.lil_matrix((4,28))
A.data = PORTION
A.rows = DATA

您的数据和列表部分列表与
lil_矩阵的内部格式完全匹配。一旦构建了
就可以转换为其他稀疏类型之一,用于数学或切片
A.toarray()
给出了完整的“密集”形式。

试试这是SciPy稀疏矩阵包。Kobi,谢谢,我已经看过了!但是,我不熟悉Scipy稀疏矩阵工具,我只懂数学,但我真的不能把它转换成我上面提到的问题。。?我该怎么做呢?我在答案中添加了一个
sparse
示例
from scipy import sparse
A = sparse.lil_matrix((4,28))
A.data = PORTION
A.rows = DATA