如何使用稀疏矩阵

时间:2017-11-28 22:20:07

标签: python numpy scipy

我想将特征向量的稀疏csr 2d输入矩阵转换为滑动窗口特征向量的稀疏csr 2d矩阵。因此,对于大小为2的窗口采用非稀疏示例:

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

变为:

array([[0, 1, 2, 3, 4, 5],
       [3, 4, 5, 6, 7, 8]])

以下函数实现了2d numpy数组:

import numpy as np
def window_stack(a, width=2):
    n = a.shape[0]
    return np.hstack(a[i:1+n+i-width:1] for i in range(0, width))
  

然而在我的情况下,我有一个大的稀疏csr矩阵。我该如何修改?   window_stack函数用于处理大型稀疏csr矩阵?

我不能让稀疏阵列作为中间步骤密集,因为这太大了。

1 个答案:

答案 0 :(得分:1)

您可以使用sparse.hstack复制密集计算:

In [1]: A = np.arange(9).reshape(3,3)
In [2]: from scipy import sparse
In [3]: M = sparse.csr_matrix(A)
In [4]: M
Out[4]: 
<3x3 sparse matrix of type '<class 'numpy.int32'>'
    with 8 stored elements in Compressed Sparse Row format>
In [5]: M.A
Out[5]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]], dtype=int32)
In [6]: [A[i:1+3+i-2,:] for i in range(2)]
Out[6]: 
[array([[0, 1, 2],
        [3, 4, 5]]), array([[3, 4, 5],
        [6, 7, 8]])]
In [7]: [M[i:1+3+i-2,:] for i in range(2)]
Out[7]: 
[<2x3 sparse matrix of type '<class 'numpy.int32'>'
    with 5 stored elements in Compressed Sparse Row format>,
 <2x3 sparse matrix of type '<class 'numpy.int32'>'
    with 6 stored elements in Compressed Sparse Row format>]
In [8]: sparse.hstack([M[i:1+3+i-2,:] for i in range(2)])
Out[8]: 
<2x6 sparse matrix of type '<class 'numpy.int32'>'
    with 11 stored elements in COOrdinate format>
In [9]: _.A
Out[9]: 
array([[0, 1, 2, 3, 4, 5],
       [3, 4, 5, 6, 7, 8]], dtype=int32)

我不会做出任何速度承诺。

稀疏矩阵乘法得到了很好的发展(假设矩阵是稀疏的,这个例子不是这样)。实际上,行/列求和,甚至切片等操作都是通过矩阵乘法完成的。也就是说,当dotted求和或选择值时,它构造一个矩阵或向量。

sparse.hstack使用稀疏块矩阵运算。这会将输入转换为coo格式,并将相应的rowcoldata数组与偏移相结合,并生成新的coo矩阵。

我可以想象结合这些步骤,但这需要相当多的工作。