我使用coo_matrix格式在Python中构建了一些稀疏矩阵M 我想找到一种有效的计算方法:

A = M + M.T - D

其中DM对其对角线的限制( M可能非常大)。 我找不到保持coo_matrix格式的有效构建D的方法。 有任何想法吗?

D = scipy.sparse.spdiags(coo_matrix.diagonal(M),0,M.shape[0],M.shape[0])是解决方案吗?

#1楼 票数:1 已采纳

我想出了一个更快的coo对角线:

msk = M.row==M.col
D1 = sparse.coo_matrix((M.data[msk],(M.row[msk],M.col[msk])),shape=M.shape)

sparse.tril使用此方法时mask = A.row + k >= A.colsparse/extract.py

有时(100,100) M (并且M1 = M.tocsr()

In [303]: timeit msk=M.row==M.col; D1=sparse.coo_matrix((M.data[msk],(M.row[msk],M.col[msk])),shape=M.shape)
10000 loops, best of 3: 115 µs per loop

In [305]: timeit D=sparse.diags(M.diagonal(),0)
1000 loops, best of 3: 358 µs per loop

所以coo得到diagional的方法是快,至少在这个小的,非常稀疏矩阵(只有1次在对角线)

如果我以csr形式开始,则diags速度会更快。 这是因为.diagonalcsr格式工作:

In [306]: timeit D=sparse.diags(M1.diagonal(),0)
10000 loops, best of 3: 176 µs per loop

但是创建D只是整个计算的一小部分。 同样,使用M1更快。 总和以csr格式完成。

In [307]: timeit M+M.T-D
1000 loops, best of 3: 1.35 ms per loop

In [308]: timeit M1+M1.T-D
1000 loops, best of 3: 1.11 ms per loop

完成整个操作的另一种方法是利用coo允许重复的i,j值这一事实,当将其转换为csr格式时将对其求和。 因此,您可以将Mrow, col, data数组与MT数组(请参阅M.transpose来构造它们)以及D掩码值进行M.transpose (或者可以从MMT移除蒙版对角线)

例如:

def MplusMT(M):
    msk=M.row!=M.col;
    data=np.concatenate([M.data, M.data[msk]])
    rows=np.concatenate([M.row, M.col[msk]])
    cols=np.concatenate([M.col, M.row[msk]])
    MM=sparse.coo_matrix((data, (rows, cols)), shape=M.shape)
    return MM

# alt version with a more explicit D
#    msk=M.row==M.col;
#    data=np.concatenate([M.data, M.data,-M.data[msk]])

编写的MplusMT非常快,因为它只是在进行数组串联,而不是求和。 为此,我们必须将其转换为csr矩阵。

MplusMT(M).tocsr() 

这需要更长的时间。 在我的有限测试中,这种方法仍然比M+MT-D快2倍以上。 因此,它是构造复杂的稀疏矩阵的潜在工具。

#2楼 票数:0

你可能想要

from scipy.sparse import diags
D = diags(M.diagonal(), 0, format='coo')

作为中间步骤,这仍将构建一个M尺寸的1d数组,但这可能还不错。

  ask by Alain translate from so

未解决问题?本站智能推荐:

1回复

如何在python中合并两个稀疏的coo_matrix矩阵?

说,我有两个coo_matrix(i,j)值:mat_1: mat_2: 我想将它们合并在一起,以便输出看起来像这样: 我怎样才能做到这一点?
1回复

将元组列表转换为稀疏coo_matrix或直接对其进行排序

我最初的问题是排序一个名为weights的SciPy稀疏coo_matrix 。 在对其进行排序之前,它看起来像: 我想要以下(结束)结果 我试图这样做: 确实对它进行了排序,但是没有得到正确的输出格式: 我的问题是,如何将获得的结果转换为正确的格式,或者是
3回复

打印完整的 coo_matrix

我尝试使用另一个矩阵实例化coo_matrix 。 当我尝试打印coo_matrix ,输出为: 如何打印完整的coo_matrix ? 我尝试使用set_printoptions(threshold = 'nan')但它不起作用。
1回复

从稀疏矩阵的行创建稀疏对角矩阵

我在Python / Scipy中处理相当大的矩阵。 我需要从大矩阵(加载到coo_matrix)中提取行并将它们用作对角元素。 目前我以下列方式做到这一点: 我从profile输出中看到的是,在提取diag_elems , get_csr_submatrix函数会消耗大部分时间。
2回复

SciPy稀疏矩阵(COO,CSR):清除行

为了创建稀疏矩阵 ,我需要一个数组或行和列索引I和J以及数据数组V 我用它们来构造COO格式的矩阵,然后将其转换为CSR , 我有一组行索引,唯一的输入应该是对角线上的1.0 。 到目前为止,我经历了I ,找到了需要擦除的所有索引,然后执行以下操作: 没问题,但是find通常
2回复

通过索引访问coo_matrix的TypeError

我有coo_matrix X并索引trn_idx通过它我可以访问该maxtrix 这样打电话: 这样: 如何通过索引访问?
1回复

将字典转换为coo_matrix

我有这样的字典, 如何将其转换为coo_matrix? 我尝试了以下操作,但出现Error: int object is not subscriptable 我需要这样做,因为LightFM.fit方法仅将coo矩阵作为参数。 预期输出(COO矩阵) :
3回复

如何获得稀疏矩阵数据数组的对角元素的索引

我有csr格式的稀疏矩阵,例如: 对于此特定示例,我想获得[0, 4] ,它们是非零对角元素0.31975333和0.62107962的数据数组索引。 一种简单的方法如下: 但实际上,矩阵很大,因此我不想使用for循环或使用toarray()方法转换为numpy数组。 有