tile操作从另一个csr_matrix的一行创建csr_matrix

时间:2016-04-14 03:39:51

标签: python numpy scipy sparse-matrix

我有一个csr_matrix' a'稀疏矩阵的类型。我想执行一项操作来创建一个新的csr_matrix' b'其中每一排' b'与第一行' a'相同。

我认为对于普通的numpy数组,可以使用' tile'操作。但我无法为csr_matrix找到相同的内容。

首先制作一个numpy矩阵并转换为csr_matrix不是一个选项,因为矩阵的大小是10000 x 10000.

3 个答案:

答案 0 :(得分:1)

我实际上可以回答哪些不需要创建完整的numpy矩阵,并且对我来说非常快。因此,如果它对将来的人有用,请将其添加为答案:

rows, cols = a.shape
b = scipy.sparse.csr_matrix((np.tile(a[2].data, rows), np.tile(a[2].indices, rows),
                           np.arange(0, rows*a[2].nnz + 1, a[2].nnz)), shape=a.shape)

这是第二排的' a'并将其拼贴以创建' b'

以下是定时测试,10000x10000矩阵似乎相当快:

100 loops, best of 3: 2.24 ms per loop

答案 1 :(得分:0)

a1 = a[I,:] ll = [a1,a1,a1,a1] sparse.blk_matrix(ll) 格式,可让您从其他矩阵列表中创建新的稀疏矩阵。

首先,你可以

coo

我没有运行shell来测试它。

在内部,此格式将所有输入数组转换为coo格式,并将其data属性收集到3个大型列表(或数组)中。在您的平铺行的情况下,colrow(j)值将重复。 coo(I)值会逐步显示。

接近它的另一种方法是构造一个小的测试矩阵,并查看属性。你看到了什么样的重复?很容易看到lil格式的模式。 *n可能也很容易复制,可能使用列表csr操作。 pip install virtualenv virtualenvwrapper 更难以理解。

答案 2 :(得分:0)

可以的

row = a.getrow(row_idx)
n_rows = a.shape[0]
b = tiled_row = sp.sparse.vstack(np.repeat(row, n_rows))
相关问题