Numpy:按索引将行从一个矩阵添加到另一个矩阵
Numpy: Add rows from one matrix to another by index
简而言之,我想对矩阵进行索引并添加到每一行。
在此示例中,第一行(索引为 0)应添加 [1,1,1]
。然后第二行(由 1 索引)应该添加 [2, 2, 2]
。最后,第一行(由第三个 0 索引)应该添加 [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])])
期望:
>>> a
array([[5, 6, 7],
[6, 7, 8]])
实际:
>>> a
array([[4, 5, 6],
[6, 7, 8]])
编辑 2:
根据下面的评论,解决方案运行缓慢。从代码的一部分,我只是添加 0 来测试速度:
print y.shape
print dW.shape
np.add.at(dW, (y, slice(None)), 0)
产量:
(49000,)
(10, 3073)
这是numpy
的一个已知问题,解释得很好here:
For example, a[[0,0]] += 1 will only increment the first element once
because of buffering, whereas add.at(a, [0,0], 1) will increment the
first element twice.
numpy
使用 add.at()
解决问题。示例:
a = array([1,2,3])
add.at(a,[0,0],4) # now a = array([9, 2, 3])
在这种情况下,我们希望它适用于多维数组:
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]]))
结果是:
array([[5, 6, 7], [6, 7, 8]])
我猜你把 7
打错了 6
。
简而言之,我想对矩阵进行索引并添加到每一行。
在此示例中,第一行(索引为 0)应添加 [1,1,1]
。然后第二行(由 1 索引)应该添加 [2, 2, 2]
。最后,第一行(由第三个 0 索引)应该添加 [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])])
期望:
>>> a
array([[5, 6, 7],
[6, 7, 8]])
实际:
>>> a
array([[4, 5, 6],
[6, 7, 8]])
编辑 2:
根据下面的评论,解决方案运行缓慢。从代码的一部分,我只是添加 0 来测试速度:
print y.shape
print dW.shape
np.add.at(dW, (y, slice(None)), 0)
产量:
(49000,)
(10, 3073)
这是numpy
的一个已知问题,解释得很好here:
For example, a[[0,0]] += 1 will only increment the first element once because of buffering, whereas add.at(a, [0,0], 1) will increment the first element twice.
numpy
使用 add.at()
解决问题。示例:
a = array([1,2,3])
add.at(a,[0,0],4) # now a = array([9, 2, 3])
在这种情况下,我们希望它适用于多维数组:
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]]))
结果是:
array([[5, 6, 7], [6, 7, 8]])
我猜你把 7
打错了 6
。