基于预期的COO结构构建稀疏的CSR矩阵结构

时间:2018-02-25 09:37:19

标签: python numpy scipy sparse-matrix

简介

请注意,没有必要详细了解这一点来回答这个问题。

我有一个矩阵P,以便

P.shape = (N, k)

和更大的m大小的随机变量向量,这样P[i,:]表示在观察i处相互作用的随机变量的索引。在所有观察之后使随机变量的逆协方差由H表示,使得

H.shape = (m, m)

我们知道如果H稀疏,则必须在

中包含条目
H[P[i,j1], P[i,j2]]

代表i in [0, ..., N-1]j1,j2 in [0, ..., k-1]

问题

我想要的是通过考虑H来构建P的稀疏性结构。我不需要计算H的确切值。我目前的方法是首先构建一个COO矩阵(使用0作为数据的占位符)然后转换为CSR,如下所示

# Build COO
col_idx = np.reshape(np.tile(P, k), [N, k, k])
row_idx = np.transpose(col_idx, [0,2,1])

col_idx = col_idx.flatten().astype(int)
row_idx = row_idx.flatten().astype(int)

indices = np.concatenate((row_idx[:,None], col_idx[:, None]),
                         axis=1)

A = sp.sparse.coo_matrix((np.zeros(indices.shape[0]),
                         (indices[:,0], indices[:,1])),
                         shape=[m, m])

# Convert to CSR
A = A.tocsr()

现在,构建COO矩阵的第一部分非常快,但转换为CSR非常慢。对于我的计算机,使用(N,k,m) = (10000,50,40000)的值,建立COO需要不到1秒,但要转换为20秒。我的实际问题需要N=300000,我猜这将需要大约30 * 20 = 600s。

这本质上是一个总是会很慢解决的问题,还是我缺少一些优化?

0 个答案:

没有答案