python - 高效切片三角稀疏矩阵

标签 python numpy scipy sparse-matrix

我有一个稀疏的三角矩阵(例如距离矩阵)。实际上,这将是一个具有高稀疏度的 > 1M x 1M 距离矩阵。

from scipy.sparse import csr_matrix
X = csr_matrix([
      [1, 2, 3, 3, 1],
      [0, 1, 3, 3, 2],
      [0, 0, 1, 1, 3],
      [0, 0, 0, 1, 3],
      [0, 0, 0, 0, 1],
])

我想将这个矩阵子集化为另一个三角距离矩阵。 索引的顺序可能不同和/或重复。

idx = np.matrix([1,2,4,2])
X2 = X[idx.T, idx]

这可能导致生成的矩阵不是三角形的,其中缺少一些值 上三角,一些值在下三角中被复制。

>>> X2.toarray()
array([[1, 3, 2, 3],
       [0, 1, 3, 1],
       [0, 0, 1, 0],
       [0, 1, 3, 1]])

如何尽可能高效地得到正确的上三角矩阵? 目前,我在子集化之前镜像矩阵,然后将其子集化到三角形,但这感觉不是特别有效,因为它至少需要复制所有条目。

# use transpose method, see https://stackoverflow.com/a/58806735/2340703
X = X + X.T - scipy.sparse.diags(X.diagonal())
X2 = X[idx.T, idx]
X2 = scipy.sparse.triu(X2, k=0, format="csr")
>>> X2.toarray()
array([[1., 3., 2., 3.],
       [0., 1., 3., 1.],
       [0., 0., 1., 3.],
       [0., 0., 0., 1.]])

最佳答案

这是一种不涉及镜像数据的方法,而是通过操作稀疏索引来达到预期的结果:

import scipy.sparse as sp

X2 = X[idx.T, idx]

# Extract indices and data (this is essentially COO format)
i, j, data = sp.find(X2)

# Generate indices with elements moved to upper triangle
ij = np.vstack([
  np.where(i > j, j, i),
  np.where(i > j, i, j)
])

# Remove duplicate elements
ij, ind = np.unique(ij, axis=1, return_index=True)

# Re-build the matrix
X2 = sp.coo_matrix((data[ind], ij)).tocsr()

关于python - 高效切片三角稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65563193/

相关文章:

python - 将 Flask-SocketIO 与 Flask-Login 和 HTTP Basic Auth 结合使用

python - np.where 如何使用正则表达式提高性能?

python - numpy loadtxt 函数使用转换器和 mdates 引发语法错误

python - scipy.optimize.leastsq 错误不是 float 组

python - 如何使用 Python 求解一对非线性方程?

python - 如何使用 scikit-image 反转黑白?

python - Pandas 值错误: too many values to unpack np. polyfit

python - 将 Dataframe 列中的值除以同一列中的前一个值

python - Numpy 同时使用 fromiter 创建两个数组

numpy - 卷积神经网络的 float16 与 float32