【问题标题】:How to make sliding window features with a sparse matrix如何使用稀疏矩阵制作滑动窗口特征
【发布时间】:2018-05-12 12:27:17
【问题描述】:

我想将特征向量的稀疏 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]])

以下函数为二维 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 矩阵吗?

我不能让稀疏数组密集作为中间步骤,因为这会太大。

【问题讨论】:

  • 好的。我真的没有看到,因为它实际上是底部的最后一行。下次一定要更清楚;-)
  • @cᴏʟᴅsᴘᴇᴇᴅ 它也在标题中,但我明白你的意思 :) 我确实喜欢你的麻木技巧。

标签: python numpy scipy


【解决方案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 矩阵。

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

【讨论】:

  • 谢谢你。我试图概括它,所以它就像我在问题中的window_stack 函数一样工作。例如,如果 M 是 4 x 4,并且您想要一个大小为 3 的滑动窗口,代码是什么?
  • 使用与密集数组相同的索引表达式。我只是使用了具体的数字,而不是你的 nwidth
猜你喜欢
  • 2013-09-25
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2023-03-29
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多