【问题标题】:Creating a sparse matrix from numpy array从 numpy 数组创建稀疏矩阵
【发布时间】: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.        ]])

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

【问题讨论】:

    标签: numpy


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2016-08-26
      相关资源
      最近更新 更多