【问题标题】:conditional slicing of scipy sparse matrixscipy稀疏矩阵的条件切片
【发布时间】:2019-02-12 09:54:23
【问题描述】:

如有重复请见谅。

我有一个大的coo_matrix(比如x)由另一个函数返回,我需要在具有相同行数和单列的numpy数组a中对匹配条件的行进行切片(二进制值)。

我正在使用 scipy.sparse.hstack([x,a]) 将两者连接起来,以便做这样的事情

x1 = x[x[:,-1] == 0]
x2 = x[x[:,-1] == 1]

但失败并出现以下错误。

TypeError: 'coo_matrix' object is not subscriptable 

x.toarray() 解决方案由于MemoryError 而不起作用。

有没有办法做到以上几点?最后我需要切片矩阵为coo_matrix

【问题讨论】:

  • 您应该更明确地说明这个明显的失败。但是我猜你被告知coo 不支持索引。 csrlil 等其他格式支持索引。也就是说,x[..]==0 将是一个问题,因为在稀疏矩阵中大多数元素将为 0。但您可以使用密集的最后一列 x1=x[:,-1].toarray() 制作掩码。
  • 谢谢保罗,我已经用具体错误更新了问题。
  • 正如我所怀疑的,coo 格式矩阵尚未实现索引。对于这种表示方式来说,它太慢太尴尬了。我在答案中添加了一条关于使用数组a 的注释,没有hstack

标签: scipy sparse-matrix


【解决方案1】:

在@ format矩阵:

中进行随机@ 987654322
In [795]: M = sparse.random(20,10,.2,'csr')

获取最后一列的密集1D阵列。 (我不希望来自矩阵的矩阵或2d数组):

In [805]: M1 = M[:,-1].A.ravel()

现在我可以用它作为行掩码:

In [808]: M[M1==0,:]
Out[808]: 
<16x10 sparse matrix of type '<class 'numpy.float64'>'
    with 30 stored elements in Compressed Sparse Row format>
In [809]: M[M1>0,:]
Out[809]: 
<4x10 sparse matrix of type '<class 'numpy.float64'>'
    with 10 stored elements in Compressed Sparse Row format>

尝试使用稀疏列掩码不起作用:

M[M[:,-1]>0,:]
IndexError: Indexing with sparse matrices is not supported except boolean indexing where matrix and index are equal shapes.

@ 987654327使用矩阵乘法完成@矩阵。指数变为1和0的稀疏矩阵,倍增最终选择所需的行。稀疏求和也用乘法进行。

lil格式也很容易。

How to get views on sparse matrices?


重新判断您的问题,我建议保持xa单独。由于a已经密集,只需使用

M1 = a.ravel()    # if a is (n,1) array
M1 = a.A1         # if a is (n,1) np.matrix

在上面的[805]中制作1d ndarray。并且由于它具有二进制值,并且您对0 VS 1

才感兴趣
M1 = M1.astype(bool)

M[~M1,:]
M[M1,:]

为两个子集。

再次,如果不清楚,我们无法索引coo格式矩阵。它必须是csrlil格式。

【讨论】:

  • 谢谢保罗,抱歉我的差别响应。这对我有用。由于我的原始稀疏矩阵在coo格式,我使用了x.tocsr()将原始矩阵转换为csr格式。我假设当我在代码稍后重复使用矩阵时,这种格式会正常工作。如果不是,我可能只是将其重新重新定位到987654342 @。最后,在csrlil @中有任何优选方法吗?再次感谢,我会让您响应此评论的进一步编辑,并将标记为正确。 span>
猜你喜欢
  • 2011-11-28
  • 2019-10-04
  • 1970-01-01
  • 2016-12-21
  • 2023-03-03
  • 1970-01-01
  • 2018-06-18
  • 2017-03-26
  • 2017-03-31
相关资源
最近更新 更多