【问题标题】:How to avoid loops for sparse Matrix?如何避免稀疏矩阵的循环?
【发布时间】:2013-10-21 04:06:41
【问题描述】:

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

问题

  • 这段代码可以正常工作,但是有循环!!!我应该删除循环,但是 怎么样?

这里,我举个例子:

输入:

  • DATA - 表示索引; [[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_sparse - 稀疏矩阵;

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 时通常不喜欢使用循环,因此,我想删除循环以使这段代码更短、更快。 任何答案将不胜感激!

【问题讨论】:

  • 试试here 那是 SciPy 稀疏矩阵包。
  • 科比,谢谢,我看过了!但是,我不熟悉 Scipy 稀疏矩阵工具,我只知道数学,但我不能真正将它转换为我上面提到的问题..?我该怎么做??
  • 我在答案中添加了一个sparse 示例

标签: python numpy sparse-matrix


【解决方案1】:

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

[[ 0  0  0  0  0 20 21 22 23 24  0  0  0]
 [ 0  0  0  0  0  0  0  0  0 24 25 26 27]
 [ 0  0  0  0  0  0  0  0 23  0 25 26 27]
 [ 0  4  8 12 16 20  0  0  0  0  0  0  0]]

这些看起来像常规列号,除了第一个以 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多