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

5
我正在使用Scipy稀疏矩阵csr_matrix,用作词-上下文向量中的上下文向量。我的csr_matrix形状为(1, 300),因此它是一个一维向量。
我需要在稀疏向量上进行置换(循环右移或循环左移)(以显示左侧和右侧上下文)。
例如:我有[1, 2, 3, 4],我想创建如下的右和左置换:
右置换:[4, 1, 2, 3] 左置换:[2, 3, 4, 1]
在csr矩阵中,我无法访问列索引,因此无法更改列索引。
是否有任何高效的、高性能的解决方案可以对csr矩阵进行行置换,或者我漏掉了什么?
可运行代码:
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列的向量,其中第0行的100、47、150三列的值都不为零,并且它们的值分别在数据列表中。现在我想要一个排列,即将这些列改变为右排列时的数组为[101, 48, 151],左排列时为[99, 46, 149]。需要注意的是,排列是循环的,这意味着如果第299列有非零数据,在使用右排列时数据将被移动到第0列。
1个回答

5
你可以访问和更改存储为NumPy数组的CSR矩阵的dataindices属性。

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]

2
你可以直接这样说:the_matrix.indices = (the_matrix.indices+1)%the_matrix.shape[1],我猜。 - justhalf
1
非常感谢您的帮助。我已经测试过了,它运行得非常好。 - alenrooni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接