Numpy:通过索引将行从一个矩阵添加到另一个矩阵

iba*_*ash 3 python numpy

总之,我想索引一个矩阵并添加到每一行.

在此示例中,第一行(由0索引)应[1,1,1]添加到其中.然后第二行(由1索引)应该[2, 2, 2]添加到它.最后,第一行(由第三行索引)应该[3, 3, 3]添加到它.

>>> a = np.array([np.array([1,2,3]), np.array([4,5,6])])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> a[np.array([0,1,0]), :] += np.array([np.array([1,1,1]), np.array([2,2,2]), np.array([3,3,3])])
Run Code Online (Sandbox Code Playgroud)

期望:

>>> a
array([[5, 6, 7],
       [6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)

实际:

>>> a
array([[4, 5, 6],
       [6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)

编辑2:

根据下面的评论,解决方案运行缓慢.从我只是添加0的代码的一部分来测试速度:

print y.shape
print dW.shape
np.add.at(dW, (y, slice(None)), 0)
Run Code Online (Sandbox Code Playgroud)

产量:

(49000,)
(10, 3073)
Run Code Online (Sandbox Code Playgroud)

大约需要21秒.没有该np.add.at行,其余代码大约需要1秒钟. y.npy dW.npy

gg3*_*349 6

这是一个众所周知的问题numpy,在这里解释得很好:

例如,[[0,0]] + = 1只会因缓冲而增加第一个元素,而add.at(a,[0,0],1)将增加第一个元素两次.

numpy用问题解决问题add.at().例:

a = array([1,2,3])
add.at(a,[0,0],4) # now a = array([9, 2, 3])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们希望这适用于多维数组:

a = np.array([np.array([1,2,3]), np.array([4,5,6])])
np.add.at(a,([0,1,0],slice(None)),array([[1,1,1],[2,2,2],[3,3,3]]))
Run Code Online (Sandbox Code Playgroud)

结果是:

array([[5, 6, 7], [6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)

我猜你错了7一个6.