【问题标题】:tile operation to create a csr_matrix from one row of another csr_matrix从另一个 csr_matrix 的一行创建 csr_matrix 的平铺操作
【发布时间】:2016-08-05 10:30:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: python numpy scipy sparse-matrix


    【解决方案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
    

    【讨论】:

    • 您的dataindices 平铺是我建议的coo,但您的indptrcoo 需要的要短。 coo 行等效项将使用 np.arange(...).repeat(nnz)[0,0..0,1,1...,2,2...] 之类的内容。
    【解决方案2】:

    有一种blk 格式,可让您从其他矩阵列表中创建新的稀疏矩阵。

    所以一开始你可以

     a1 = a[I,:]
     ll = [a1,a1,a1,a1]
     sparse.blk_matrix(ll)
    

    我没有运行 shell 来测试这个。

    这种格式在内部将所有输入数组转换为coo 格式,并将它们的coo 属性收集到3 个大列表(或数组)中。在平铺行的情况下,datacol (j) 值只会重复。 row (I) 值会逐步变化。

    另一种方法是构建一个小的测试矩阵,并查看属性。你看到什么样的重复?在coo格式中很容易看到模式。 lil 也可能很容易复制,可能使用列表 *n 操作。 csr 更难理解。

    【讨论】:

    • 创建 ll 不会占用大量内存。它不会破坏拥有稀疏矩阵的目的吗?
    • 另外我想我可以找到解决方案,所以我将其添加为答案。有兴趣的可以看看。
    • 直接创建csr 会更紧凑一些,因为indptr 属性比等效的coo rows 短。
    【解决方案3】:

    一个人可以做

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

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2021-06-16
      相关资源
      最近更新 更多