从 numpy 数组创建稀疏矩阵

Posted

技术标签:

【中文标题】从 numpy 数组创建稀疏矩阵【英文标题】:Creating a sparse matrix from numpy array 【发布时间】:2013-02-02 21:06:19 【问题描述】:

我需要使用 numpy 数组中的值创建一个矩阵。这些值应根据索引数组分布在矩阵行上。

像这样:

>>> values
array([ 0.73620381,  0.61843002,  0.33604769,  0.72344274,  0.48943796])
>>> inds
array([0, 1, 2, 3, 2])
>>> m = np.zeros((4, 5))
>>> for i, (index, value) in enumerate(zip(inds, values)):
        m[index, i] = value
>>> m
array([[ 0.73620381,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.61843002,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.33604769,  0.        ,  0.48943796],
       [ 0.        ,  0.        ,  0.        ,  0.72344274,  0.        ]])

我想知道是否有一种矢量化的方式来做到这一点,即没有循环。有什么建议吗?

【问题讨论】:

【参考方案1】:

以下是使用fancy indexing 的方法:

>>> values
array([ 0.73620381,  0.61843002,  0.33604769,  0.72344274,  0.48943796])
>>> inds
array([0, 1, 2, 3, 2])
>>> mshape = (4,5)
>>> m = np.zeros(mshape)
>>> m[inds,np.arange(mshape[1])] = values
>>> m
array([[ 0.73620381,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.61843002,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.33604769,  0.        ,  0.48943796],
       [ 0.        ,  0.        ,  0.        ,  0.72344274,  0.        ]])

【讨论】:

[查看他的命令历史,看看为什么这对他不起作用,因为这是他尝试的第一件事.. 意识到他是个白痴.. 删除他的答案并对此表示赞同。 IOW,一个典型的下午。] @DSM,我们都去过那里。 FWIW,你的 numpy/scipy 答案总是很出色。【参考方案2】:

您的valuesinds 数组可以用作scipy.sparse 构造函数的输入(类似于Matlab 中的稀疏)。

from scipy import sparse
values = np.array([ 0.73620381,  0.61843002,  0.33604769,  0.72344274,  0.48943796])
inds=np.array([0,1,2,3,2])
index = np.arange(5)
m=sparse.csc_matrix((values,(inds,index)),shape=(4,5))
m.todense()  # produces a matrix or
m.toarray()

【讨论】:

以上是关于从 numpy 数组创建稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

将numpy对象数组转换为稀疏矩阵

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

scipy稀疏矩阵和numpy数组之间的点积给出ValueError

直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵

SciPy NumPy 和 SciKit-learn ,创建一个稀疏矩阵

从numpy python中的稀疏矩阵生成密集矩阵