我想将特征向量的稀疏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矩阵?
我不能让稀疏阵列作为中间步骤密集,因为这太大了。
答案 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
格式,并将相应的row
,col
,data
数组与偏移相结合,并生成新的coo
矩阵。
我可以想象结合这些步骤,但这需要相当多的工作。