【问题标题】:Adding values to non zero elements in a Sparse Matrix向稀疏矩阵中的非零元素添加值
【发布时间】:2018-09-29 03:40:35
【问题描述】:

我有一个稀疏矩阵,我想将所有非零元素的值加一。但是,我无法弄清楚。有没有办法在 python 中使用标准包来做到这一点?任何帮助将不胜感激。

【问题讨论】:

  • 你的矩阵有多少维?
  • 嗨,我使用的是 1Mx1.5M 维矩阵。我尝试使用 numpy 矩阵,但它适用于较小的尺寸。这对我的系统来说太大了,我现在正在使用 16GB 的 RAM。所以我只想为稀疏矩阵中的所有非零元素添加值。
  • 您是否尝试过我在下面的答案中写的解决方案?

标签: python machine-learning sparse-matrix


【解决方案1】:

我无法评论它的性能,但你可以评论(Scipy 1.1.0);

>>> from scipy.sparse import csr_matrix
>>> a = csr_matrix([[0, 2, 0], [1, 0, 0]])
>>> print(a)
(0, 1)        2
(1, 0)        1
>>> a[a.nonzero()] = a[a.nonzero()] + 1
>>> print(a)
(0, 1)        3
(1, 0)        2

【讨论】:

  • 这给出了错误-NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported
  • @atinjanki 嗨,感谢您的反馈。它可能与 scipy 版本有关,我已经更新了我的回复。
【解决方案2】:

如果您的矩阵有 2 个维度,您可以执行以下操作:

sparse_matrix = [[element if element==0 else element+1 for element in row ]for row in sparse_matrix]

它将遍历矩阵的每个元素,如果它等于 0,则返回该元素而不做任何更改,否则它将向该元素添加 1 并返回它。

the answer for this question 中有关列表理解中的条件的更多信息。

【讨论】:

    【解决方案3】:

    您可以使用包numpy,它具有处理n 维数组的高效函数。你需要的是:

    array[array>0] += 1

    array 是矩阵的 numpy 数组。这里的例子: `

    import numpy as np
    my_matrix = [[2,0,0,0,7],[0,0,0,4,0]]
    array = np.array(my_matrix);
    print("Matrix before incrementing values: \n", array)
    array[array>0] += 1
    print("Matrix after incrementing values: \n", array)`
    

    输出:

    Matrix before incrementing values: 
     [[2 0 0 0 7]
     [0 0 0 4 0]]
    Matrix after incrementing values: 
     [[3 0 0 0 8]
     [0 0 0 5 0]]
    

    希望这会有所帮助!

    【讨论】:

    • 您好,感谢您的回复!我之前尝试过这种方法,它适用于具有合理维度的矩阵。就我而言,我使用的是 [1Mx1.5M] 维矩阵。 M在这里是一百万。所以我无法将这个稀疏矩阵转换为一个 numpy 数组,因为它给了我一个内存错误。我有 16 GB 的 RAM,我无法删除这些功能或删除一些行。所以理想的解决方案将是一个稀疏矩阵。因此,作为对我的问题的更正,我想特别询问有关将值添加到稀疏矩阵而不是 numpy 数组中的非零元素的问题。
    【解决方案4】:

    当你有一个scipy 稀疏矩阵 (scipy.sparse) 时:

    import scipy.sparse as sp
    my_matrix = [[2,0,0,0,7],[0,0,0,4,0]]
    my_matrix = sp.csc_matrix(my_matrix)
    my_matrix.data += 1
    my_matrix.todense()
    

    返回:

    [[3, 0, 0, 0, 8], [0, 0, 0, 5, 0]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多