Python 使用numpy将向量转换为遮罩矩阵
假设我们有以下向量:Python 使用numpy将向量转换为遮罩矩阵,python,numpy,matrix,scipy,vectorization,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中,您可以在一行中使用sparse和full函数来实现这一点。 我不希望使用for
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中,您可以在一行中使用sparse
和full
函数来实现这一点。
我不希望使用for
循环,因为我正在寻找此循环的矢量化实现。您可以执行以下操作:
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]])
如果需要密集数组输出,可以使用两个整数数组来索引非零元素的行/列:
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]]
为了清楚起见,您希望输出矩阵是稀疏的还是密集的?我将使用这个“M”作为掩码矩阵,通过元素相乘(exp:result=a.*M)抵消一些值。M将是巨大的,例如“10000x10”。所以我的目标是使用最优化的一个。密集或稀疏都可以,只要速度快且矢量化。@superMind,那么您可能需要一个稀疏矩阵。
a
稀疏还是密集?a是密集矩阵。在每一列中,我只想取消一个条目,基本上使用M的补码