如何将向量分离为基向量?

How can I separate a vector into basis vectors?

我有基础:

>>> m = 6
>>> basis = np.zeros((m, m))
>>> np.fill_diagonal(basis, 1)
array([[1. 0. 0. 0. 0. 0.]
       [0. 1. 0. 0. 0. 0.]
       [0. 0. 1. 0. 0. 0.]
       [0. 0. 0. 1. 0. 0.]
       [0. 0. 0. 0. 1. 0.]
       [0. 0. 0. 0. 0. 1.]]

如何访问向量的叠加?假设来自:

vec = [0, 1, 1, 0, 1, 0]

所以我想要输出:

array([[0. 1. 0. 0. 0. 0.]
       [0. 0. 1. 0. 0. 0.]
       [0. 0. 0. 0. 1. 0.]]

我们可以用vec的元素个数构造一条对角线,然后对行进行过滤,所以:

>>> vec = np.array([0,1,1,0,1,0])
>>> np.identity(6)[vec.astype(bool)]
array([[0., 1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0.]])

然而,如果 vec 中的项数很大,这不是很有效,因为构建单位矩阵需要 vec.

长度的二次方时间

我们也可以使用 .diag(…) 正如@AlexAlex 所说:

>>> vec = np.array([0,1,1,0,1,0])
>>> np.diag(vec)[vec.astype(bool)]
array([[0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0]])

这里我们可以指定不同的值,例如:

>>> vec = np.array([0,1,2,0,3,0])
>>> np.diag(vec)[vec.astype(bool)]
array([[0, 1, 0, 0, 0, 0],
       [0, 0, 2, 0, 0, 0],
       [0, 0, 0, 0, 3, 0]])