【问题标题】:In-place sorting of csc_matrix columnscsc_matrix 列的就地排序
【发布时间】:2018-09-21 03:20:10
【问题描述】:

我希望能够对 scipy 稀疏矩阵的列进行排序。 scipy 文档相当简洁,我看不到太多关于修改矩阵的内容。在 SO 我找到了这个post,但给出的答案返回了一个list

我要写的代码是

s = rand(4, 4, density=0.25, format='csc')

_,colSize = s.get_shape()    
for j in range(0,colSize):
   s.setcol(j, sorted(s.getcol(j), key=attrgetter('data'), reverse=True))

除了没有setcolsorted 不返回与getcol 相同的类型。

作为我想要得到的示例,如果我有输入

<class 'scipy.sparse.csc.csc_matrix'>
[[ 0.          0.33201655  0.          0.        ]
 [ 0.          0.          0.          0.        ]
 [ 0.          0.81332962  0.          0.50794041]
 [ 0.          0.41478979  0.          0.        ]]

那么我想要的输出是

[[ 0.          0.81332962    0.          0.50794041]
 [ 0.          0.414789790.  0.          0.        ]
 [ 0.          0.332016550.  0.          0.        ]
 [ 0.          0.            0.          0.        ]]

(不一定是 csc 矩阵,我认为这对于列操作会更好)

【问题讨论】:

  • Inserting null columns into a scipy sparse matrix in a specific order 探索了一些用于重新排序列的替代方法。但它不是就地的。
  • 在您的示例数组中,所有非零值都是正数。你的实际数组是这种情况吗?
  • 在进一步阅读中,您正在尝试做一些与我最近链接的答案完全不同的事情。但我会留下评论;它可能会提供一些关于稀疏矩阵的有用想法。
  • @Warren 这些值是事件计数,因此它们将是大于或等于零的整数。

标签: python-3.x scipy sparse-matrix


【解决方案1】:

这是一个按降序对列进行就地排序的简短函数:

import numpy as np


def sort_csc_cols(m):
    """
    Sort the columns of m in descending order.

    m must be a csc_matrix whose nonzero values are all positive.
    m is modified in-place.
    """
    seq = np.arange(m.shape[0])
    for k in range(m.indptr.size - 1):
        start, end = m.indptr[k:k + 2]
        m.data[start:end][::-1].sort()
        m.indices[start:end] = seq[:end - start]

例如,scsc_matrix

In [47]: s
Out[47]: 
<8x12 sparse matrix of type '<class 'numpy.int64'>'
    with 19 stored elements in Compressed Sparse Column format>

In [48]: s.A
Out[48]: 
array([[ 0,  2,  0,  0,  7,  0,  0, 48,  0,  0,  0,  0],
       [ 0,  0, 82,  0,  0, 38, 67, 17,  9,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0],
       [ 0,  0,  0,  0,  0,  0, 99,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0, 83,  0,  0,  0,  9],
       [ 0,  0,  0,  0,  0,  0, 85, 94,  0, 55, 68,  0],
       [ 0,  0,  0,  0,  0,  0, 22,  0,  0,  0, 71,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0]])

In [49]: sort_csc_cols(s)

In [50]: s.A
Out[50]: 
array([[ 0,  2, 82,  0,  7, 38, 99, 94,  9, 55, 71,  9],
       [ 0,  0,  0,  0,  0,  0, 85, 83,  0,  0, 68,  0],
       [ 0,  0,  0,  0,  0,  0, 67, 48,  0,  0, 47,  0],
       [ 0,  0,  0,  0,  0,  0, 22, 17,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0]])

【讨论】:

  • 在一个小例子上效果很好。
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2013-05-11
  • 2013-10-10
  • 1970-01-01
  • 2010-10-02
  • 2017-09-04
  • 2020-12-28
相关资源
最近更新 更多