使用 numpy 将向量转换为掩码矩阵
Convert a vector to a mask matrix using numpy
假设我们有以下向量:
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]])
如果你想要一个密集的数组输出,你可以只使用两个整数数组来索引 rows/cols 的非零元素:
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]]
假设我们有以下向量:
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]])
如果你想要一个密集的数组输出,你可以只使用两个整数数组来索引 rows/cols 的非零元素:
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]]