numpy,用其他矩阵的行填充稀疏矩阵

Posted

技术标签:

【中文标题】numpy,用其他矩阵的行填充稀疏矩阵【英文标题】:numpy, fill sparse matrix with rows from other matrix 【发布时间】:2017-10-19 19:11:43 【问题描述】:

我无法确定执行以下操作的最有效方法是什么:

import numpy as np

M = 10
K = 10
ind = np.array([0,1,0,1,0,0,0,1,0,0])
full = np.random.rand(sum(ind),K)
output = np.zeros((M,K))
output[1,:] = full[0,:]
output[3,:] = full[1,:]
output[7,:] = full[2,:]

我想构建输出,它是一个稀疏矩阵,其行以密集矩阵(完整)给出,行索引通过二进制向量指定。 理想情况下,我想避免 for 循环。那可能吗?如果没有,我正在寻找最有效的循环方式。

我需要多次执行此操作。 ind 和 full 会不断变化,因此我只是提供了一些示例值来说明。 我希望 ind 非常稀疏(最多 10%),并且 M 和 K 都是大数(10e2 - 10e3)。最终,我可能需要在 pytorch 中执行此操作,但是一些不错的 numpy 程序已经让我走得很远。

如果您有一个或多个适合该问题的类别,还请帮我为该问题找到一个更合适的标题。

非常感谢, 最大

【问题讨论】:

【参考方案1】:
output[ind.astype(bool)] = full

通过将ind 中的整数值转换为布尔值,您可以使用boolean indexing 来选择output 中您想用full 中的值填充的行。

4x4 数组示例

M = 4
K = 4
ind = np.array([0,1,0,1])
full = np.random.rand(sum(ind),K)
output = np.zeros((M,K))

output[ind.astype(bool)] = full

print(output)

[[ 0.          0.          0.          0.        ]
 [ 0.32434109  0.11970721  0.57156261  0.35839647]
 [ 0.          0.          0.          0.        ]
 [ 0.66038644  0.00725318  0.68902177  0.77145089]]

【讨论】:

以上是关于numpy,用其他矩阵的行填充稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

numpy.ndarray稀疏矩阵到密集

具有numpy的大型稀疏矩阵的余弦相似度

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

Scipy 稀疏矩阵作为 DataFrame 列

matlab如何生成大规模稀疏矩阵?

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵