使用numpy将矢量转换为蒙版矩阵

时间:2015-01-26 01:19:54

标签: python numpy matrix scipy vectorization

假设我们有以下向量:

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循环,因为我正在寻找一个矢量化的实现。

2 个答案:

答案 0 :(得分: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]])

答案 1 :(得分:1)

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

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]]