Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy将向量转换为遮罩矩阵_Python_Numpy_Matrix_Scipy_Vectorization - Fatal编程技术网

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的补码