我有三个numpy数组:
X:一个3073 x 49000的矩阵
W:一个10 x 3073的矩阵
y:一个49000 x 1的向量
y中包含0到9之间的值,每个值代表W中的一行。
我想将X的第一列添加到由y的第一个元素给出的W中的行中。即,如果y的第一个元素为3,则将X的第一列添加到W的第四行。然后将X的第二列添加到由y的第二个元素给出的W中的行中,以此类推,直到X的所有列都添加到由y指定的W中的行中,这意味着总共添加了49000行。
"W[y] += X.T"对我来说不起作用,因为这不会将多个向量添加到W中的一行。
请注意:我只在寻找向量化的解决方案。即无需使用for循环。
问题是将X的第0列和第4列添加到W的第0行,以及将X的第1列和第2列添加到W的第1行。
X:一个3073 x 49000的矩阵
W:一个10 x 3073的矩阵
y:一个49000 x 1的向量
y中包含0到9之间的值,每个值代表W中的一行。
我想将X的第一列添加到由y的第一个元素给出的W中的行中。即,如果y的第一个元素为3,则将X的第一列添加到W的第四行。然后将X的第二列添加到由y的第二个元素给出的W中的行中,以此类推,直到X的所有列都添加到由y指定的W中的行中,这意味着总共添加了49000行。
"W[y] += X.T"对我来说不起作用,因为这不会将多个向量添加到W中的一行。
请注意:我只在寻找向量化的解决方案。即无需使用for循环。
In [1]: import numpy as np
In [2]: a, b, c = 3, 4, 5
In [3]: np.random.seed(0)
In [4]: X = np.random.randint(10, size=(b,c))
In [5]: W = np.random.randint(10, size=(a,b))
In [6]: y = np.random.randint(a, size=(c,1))
In [7]: X
Out[7]:
array([[5, 0, 3, 3, 7],
[9, 3, 5, 2, 4],
[7, 6, 8, 8, 1],
[6, 7, 7, 8, 1]])
In [8]: W
Out[8]:
array([[5, 9, 8, 9],
[4, 3, 0, 3],
[5, 0, 2, 3]])
In [9]: y
Out[9]:
array([[0],
[1],
[1],
[2],
[0]])
In [10]: W[y.ravel()] + X.T
Out[10]:
array([[10, 18, 15, 15],
[ 4, 6, 6, 10],
[ 7, 8, 8, 10],
[ 8, 2, 10, 11],
[12, 13, 9, 10]])
In [11]: W[y.ravel()] = W[y.ravel()] + X.T
In [12]: W
Out[12]:
array([[12, 13, 9, 10],
[ 7, 8, 8, 10],
[ 8, 2, 10, 11]])
问题是将X的第0列和第4列添加到W的第0行,以及将X的第1列和第2列添加到W的第1行。
因此,所需的结果为:
W = [[17, 22, 16, 16],
[ 7, 11, 14, 17],
[ 8, 2, 10, 11]]
将加法向量化为由另一个数组索引的数组
。 - Divakar