【问题标题】:VSTACK scipy.sparse.csr.csr_matrix to one single csr matrixVSTACK scipy.sparse.csr.csr_matrix 到一个单一的 csr 矩阵
【发布时间】:2020-08-23 17:23:04
【问题描述】:

我最近努力处理稀疏矩阵并将它们堆叠到单个矩阵中。 我曾经创建多个 csr_matrix 对象

vec_list = sp.sparse.csr_matrix(my_vec_i) # every vector of shape (1,200)

vec_list 包含大约 100 个稀疏矩阵之后,我使用 scipy(不是 numpy)的 sp.vstack 函数将所有 100 个条目合并到一个形状为 (100, 200) 的 csr 矩阵。

现在在我当前的设置(python 3.8)中,我看到一个警告说 sp.vstack 将被弃用,但无论如何,不​​管我使用的是 numpy 还是 scipy 的 vstack 功能,我最终有一个形状为 (100,1) 的数组,其中我的 200 列被视为第一列也是唯一列中的 1 个 csr_matrix 条目。

在我的旧代码 sn-ps 中,我可以看到,sp.vstack(vec_list) 创建了一个形状为 (100,200) 的 稀疏 crs 矩阵.. 我想念什么吗,有人对此有想法吗?我有点不顾一切地想要创建我的堆叠稀疏矩阵.. 谢谢大家

编辑: 正如您在下面我的评论中看到的那样,np.vstack 和 sp.vstack 不一定会这样做(在我的回答中,我对 np.vstack 感到悲伤两次,但我的意思是 sp.vstack 一次)。我使用的是精确的解决方案(复制的),它在某个时候返回了一个错误,因为没有发生堆叠。 为了使用 sp.stacking,我堆叠了非 csr_matrix 数组,然后将其转换为 csr_matrix。这在使用大量数组时是不切实际的,但至少我可以毫无问题地运行该文件。 为了解决 Tinu 的以下答案,我无法以这种方式解决它,因为结果如下所示 - 执行示例代码时:

>>> np.vstack(vec_list).shape
(100, 1)
>>> sp.vstack(vec_list).shape
(100, 200)

Python 3.8.2、Scipy 1.4.1

【问题讨论】:

  • 如果您明确展示您如何定义sp,这将有助于我们理解您的问题。我假设你已经完成了import scipy as sp。如果是这样,那么sp.vstacknumpy.vstack 的功能完全相同。这种重复造成的混乱是不推荐在 scipy 命名空间中包含 numpy 名称的原因之一。对于稀疏矩阵,您需要scipy.sparse.vstack,如@Tinu 的回答。
  • 感谢您的澄清。我在下面发布了最终答案

标签: python matrix scipy csr


【解决方案1】:

很遗憾,我无法看到与上述相同的结果 - 使用我的 Python 3.8.3rc1。复制代码并堆叠导致如下:

>>> np.vstack(vec_list).shape # (100, 1)
>>> sp.vstack(vec_list).shape # (100, 1)

我将做些什么来规避我的问题:我将堆叠非 csr_matrix 数组,然后将其转换为 csr_matrix。还是谢谢!

【讨论】:

    【解决方案2】:

    很遗憾,我无法重现您的错误。这是我的代码:

    from scipy.sparse import csr_matrix, vstack
    import numpy as np
    
    vec_list = []
    for i in range(100):
        vec_list.append(csr_matrix(np.random.randint(2,size=(1,200))))
    vec_mat = vstack(vec_list)
    vec_mat.shape
    

    输出:

    (100, 200)
    

    我正在使用 python 3.8.2 和 scipy 1.4.1

    【讨论】:

    • 很有趣,谢谢!我会花药调查一下这个
    • 我无法解释为什么我们会看到不同的结果.. >>> vec_list = [] >>> for i in range(100): ... vec_list.append(csr_matrix(np.random.randint (2,size=(1,200)))) ... >>> >>> a = np.vstack(vec_list) >>> b = np.vstack(vec_list) >>> a.shape, b.shape ( (100, 1), (100, 1))
    • 在您的问题下查看@Warren Weckesser 的第一条评论。我使用scipy.sparse.vstack,而您使用numpy.vstack,这两个函数不会返回相同的稀疏数组。
    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多