【问题标题】:Indexing and replacing values in sparse CSC matrix (Python)在稀疏 CSC 矩阵(Python)中索引和替换值
【发布时间】:2019-08-28 13:59:45
【问题描述】:

我有一个稀疏的 CSC 矩阵“A”,我想用一个全为零的向量替换其中的第一行,但第一个条目是 1 除外。

到目前为止,我正在做低效的版本,例如:

import numpy as np
from scipy.sparse import csc_matrix

row = np.array([0, 2, 2, 0, 1, 2])
col = np.array([0, 0, 1, 2, 2, 2])
data = np.array([1, 2, 3, 4, 5, 6])
A = csc_matrix((data, (row, col)), shape=(3, 3))
replace = np.zeros(3)
replace[0] = 1 
A[0,:] = replace
A.eliminate_zeros()

但我想用 .indptr、.data 等来做。因为它是 CSC,我猜这也可能效率低下?在我的确切问题中,矩阵是 66000 X 66000。

对于 CSR 稀疏矩阵,我已经看到它完成了

A.data[1:A.indptr[1]] = 0
A.data[0] = 1.0
A.indices[0] = 0
A.eliminate_zeros()

所以,基本上我想对 CSC 稀疏矩阵做同样的事情。

预期结果:与上述完全相同,只是效率更高(适用于非常大的稀疏矩阵)。

即从:开始

[1, 0, 4],
[0, 0, 5],
[2, 3, 6]

并将上面的行替换为与矩阵一样长的向量,除开头的 1 外全为零。因此,应该以

结尾
[1, 0, 0],
[0, 0, 5],
[2, 3, 6]

并且能够有效地处理大型稀疏 CSC 矩阵。

提前致谢:-)

【问题讨论】:

  • 我不确定直接使用indptr 会比使用A[0,:]= 更快。创建密集的replace 足够高效。需要记住的是,csc 索引不会从稀疏结构中删除新的 0。这需要一个单独的“删除零”方法调用。
  • 即使在尺寸更大的情况下? IE。 66000 x 66000

标签: python numpy scipy sparse-matrix


【解决方案1】:

您可以通过indptr 和indices 来完成。如果你想用indptr和indices参数构造你的矩阵:

indptr = np.array([0, 2, 3, 6])
indices = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
A = csc_matrix((data, indices, indptr), shape=(3,3))

但是如果你想设置第一行的所有元素,除了第 0 行的第一个元素,你需要将那些索引为零的数据值设置为零。换句话说:

data[indices == 0] = 0

上面的行将第一行的所有元素设置为0。为了避免将第一个元素设置为零,我们可以执行以下操作:

indices_tmp = indices == 0
indices_tmp[0] = False    # to avoid removing the first element in row 0.
data[indices_tmp == True] = 0
A = csc_matrix((data, indices, indptr), shape=(3,3))

希望对您有所帮助。

【讨论】:

  • 感谢您的建议!问题是我首先使用 spdiags 构建(大)矩阵,因此需要能够在构建后进行。
  • 您可以使用A.data、A.indicesarrays 就地进行类似的操作。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2015-12-05
  • 2012-01-15
  • 2014-05-12
  • 2020-05-31
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多