【问题标题】:Convert a vector to a mask matrix using numpy使用 numpy 将向量转换为掩码矩阵
【发布时间】:2015-03-24 11:29:44
【问题描述】:

假设我们有以下向量:

v = np.array([4, 0, 1])

目标是创建 5 x 3 矩阵M,如下所示:

[[0 1 0]
 [0 0 1]
 [0 0 0]
 [0 0 0]
 [1 0 0]]

对于v 中的相应索引,每列中只有一个元素等于1。例如,既然v[0] 是 4,那么 M[4, 0] == 1,因为 v[2] 是 1,那么 M[1, 2] == 1

如何使用 scipy 和 numpy 在 Python 中构建这样的矩阵?在 MATLAB 中,您可以在一行中使用 sparsefull 函数来执行此操作。 我不想使用for 循环,因为我正在寻找它的矢量化实现。

【问题讨论】:

  • 明确一点,您希望输出矩阵是稀疏的还是密集的?
  • 我将使用这个“M”作为掩码矩阵,通过元素乘法来抵消一些值(exp: result=A.*M)。 M将是巨大的前“100,000x10”。所以我的目标是使用最优化的。只要快速且矢量化,密集或稀疏都可以。
  • @superMind,那么你可能想要一个稀疏矩阵。
  • A 是稀疏的还是密集的?
  • A 是密集矩阵。在每一列中,我只想取消一个条目,基本上是使用 M 的补码

标签: python numpy matrix scipy vectorization


【解决方案1】:

你可以这样做:

from scipy import sparse

inds = np.array([4, 0, 1])
values = np.ones_like(inds)       # [1, 1, 1]
index = np.arange(inds.shape[0])  # 3
m = sparse.csc_matrix((values, (inds, index)), shape=(5, 3))

输出:

>>> m.todense()
matrix([[0, 1, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0],
        [1, 0, 0]])

【讨论】:

    【解决方案2】:

    如果你想要一个密集的数组输出,你可以只使用两个整数数组来索引非零元素的行/列:

    v = np.array([4, 0, 1])
    x = np.zeros((5, 3), np.int)
    x[v, np.arange(3)] = 1
    
    print(x)
    # [[0 1 0]
    #  [0 0 1]
    #  [0 0 0]
    #  [0 0 0]
    #  [1 0 0]]
    

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2016-02-02
      • 2018-10-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多