首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >csc_matrix列的就地排序

csc_matrix列的就地排序
EN

Stack Overflow用户
提问于 2018-04-09 16:14:26
回答 1查看 192关注 0票数 1

我想要能够对一个稀疏矩阵的列进行排序。参与文档相当简洁,我看不出有多少关于修改矩阵的内容。所以我找到了这个post,但是给出的答案返回一个list

我想要写的代码是

代码语言:javascript
复制
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相同的类型。

作为我想要得到的一个例子,如果我有输入

代码语言:javascript
复制
<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.        ]]

那么我想要的输出是

代码语言:javascript
复制
[[ 0.          0.81332962    0.          0.50794041]
 [ 0.          0.414789790.  0.          0.        ]
 [ 0.          0.332016550.  0.          0.        ]
 [ 0.          0.            0.          0.        ]]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 19:20:15

下面是一个简短的函数,该函数按相应的降序排列列:

代码语言:javascript
复制
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]

例如,s是一个csc_matrix

代码语言:javascript
复制
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]])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49737299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档