如何在Scipy Python稀疏矩阵中实现CSR_Matrix的循环置换(左移和右移)?

时间:2013-12-09 14:33:46

标签: python scipy permutation sparse-matrix

我使用Scipy稀疏矩阵csr_matrix作为词上下文向量中的上下文向量。我的csr_matrix(1, 300)形状,因此它是一维向量。

我需要在稀疏向量上使用置换(圆形右移或圆左移)(用于显示左上下文和右上下文)。

例如: 我有[1, 2, 3, 4],我想创建左右排列,如下所示:

正确的排列:[4, 1, 2, 3]
左排列:[2, 3, 4, 1]

在csr矩阵中,我无法访问列索引,所以我不能只改变列索引。

csr_matrix中是否存在针对行排列的有效高性能解决方案,或者我错过了哪些内容?

可运行的代码:

from scipy.sparse import csr_matrix
rows = [0, 0, 0]
columns = [100, 47, 150]
data = [-1, +1, -1]
contextMatrix = csr_matrix( (data,(rows, columns)), shape=(1, 300) )

这意味着我有一个300列向量,其中第100行,第47行,第150行都是非零值,它们的值分别在数据列表中。

现在我想要的是一个排列,这意味着我希望将列数组更改为 右置换的[101,48,151]和左置换的[99,46,149]。

应该注意的是,排列是循环的,这意味着如果列299具有非零数据,则使用右排列将数据移动到第0列。

1 个答案:

答案 0 :(得分:4)

您可以访问和更改CSR矩阵的dataindices属性,这些属性存储为NumPy数组。

http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html#scipy.sparse.csr_matrix

因此,使用您的代码并遵循评论中的建议,您可以这样做:

from scipy.sparse import csr_matrix
rows = [0, 0, 0]
columns = [100, 47, 150]
data = [-1, +1, -1]
m = csr_matrix( (data,(rows, columns)), shape=(1, 300) )

indices = m.indices

# right permutation
m.indices = (indices + 1) % m.shape[1]

# left permutation
m.indices = (indices - 1) % m.shape[1]