如何将向量分离为基向量?
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]])
我有基础:
>>> 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]])