【问题标题】:splitting a sparse matrix into two将稀疏矩阵一分为二
【发布时间】:2012-08-31 10:49:01
【问题描述】:

问题:如何根据列表中的值将 1 个稀疏矩阵拆分为 2 个?

也就是说,我有一个稀疏矩阵X

>>print type(X)
<class 'scipy.sparse.csr.csr_matrix'>

我在脑海中将其想象为列表列表,如下所示:

>>print X.todense()
[[1,3,4]
 [3,2,2]
 [4,8,1]]

我有一个列表y,看起来像这样:

y = [-1, 
      3, 
     -4]

如何根据y 中的对应值是正数还是负数,将X 分成两个稀疏矩阵?例如,我怎样才能得到:

>>print X_pos.todense()
 [[3,2,2]] 
>>print X_neg.todense()
 [[1,3,4]
  [4,8,1]]

结果(X_posX_neg)显然也应该是稀疏矩阵,因为它只是拆分一个稀疏矩阵开始。

谢谢!

【问题讨论】:

  • @DavidHeffernan:实际上,这很容易实现。看我的回答。

标签: python numpy scipy sparse-matrix


【解决方案1】:

使用np.where 为正负y 值生成两个索引数组,然后使用这些索引到您的稀疏矩阵中。

>>> X = csr_matrix([[1,3,4], [3,2,2], [4,8,1]])
>>> y = np.array([-1, 3, -4])
>>> y_pos = np.where(y > 0)[0]
>>> y_neg = np.where(y < 0)[0]
>>> X_pos = X[y_pos]
>>> X_neg = X[y_neg]

您现在必须包含所需元素的 CSR 矩阵:

>>> X_pos
<1x3 sparse matrix of type '<type 'numpy.int64'>'
    with 3 stored elements in Compressed Sparse Row format>
>>> X_neg
<2x3 sparse matrix of type '<type 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Row format>
>>> X_pos.A
array([[3, 2, 2]])
>>> X_neg.A
array([[1, 3, 4],
       [4, 8, 1]])

【讨论】:

  • 这里没有两个稀疏矩阵。索引到 CSR 矩阵并不便宜。通常人们使用稀疏矩阵,因为人们关心性能。当然,如果您不关心性能,那么解决它是微不足道的。我希望 OP 希望从 CSR 输入有效地生成两个 CSR 矩阵。这很重要。
  • @DavidHeffernan:我这里有两个稀疏矩阵; .A.toarray() 的缩写)将它们转换为密集数组以方便查看。根据their docs,“高效行切片”是 CSR 矩阵实际设计的目标之一。
  • 好的。您索引到原始 CSR 矩阵的位肯定很昂贵。想象一下你将如何实现它。从 CSR 矩阵开始并创建一个新的矩阵,其中所有符合特定标准的元素都被删除,这并不难。只需一次通过值数组,并适当更新 col 索引和行指针。但这不是这里发生的事情。我想。
  • 如果代码可以假设y_pos 是有序的,那么索引X_pos = X[y_pos] 会非常有效。否则它会有点贵,但它仍然可以有效地完成。 FWIW,我不认为这是行切片,但这没有实际意义。所以,我收回我的反对意见。假设 numpy 实施得很好,这应该是非常有效的。 +1
  • @DavidHeffernan:你是对的,这不是切片,我的错。但是,我之前在中等规模的数据集上使用过它,它通常足够快,尽管它可能会占用相当多的内存。
猜你喜欢
  • 2020-02-29
  • 2018-01-19
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多