我觉得这个问题和我之前问过的问题很相似,但我想不通。如何将这两行代码转换成没有for循环的一行?你知道吗
for i in xrange(X.shape[0]):
dW[:,y[i]] -= X[i]
在英语中,矩阵X中的每一行都应该从由向量y给出的矩阵dW中的相应列中减去
我应该提到dW是DXC,X是NXD,所以X的转置与W的形状不同,否则我可以对X的行重新排序,直接进行转置。但是,dW中的列可能有多个需要减去的对应行。你知道吗
我觉得我对python中的索引应该如何工作没有一个很好的理解,这使得删除不必要的for循环很困难,甚至不知道什么for循环可以删除。你知道吗
矢量化的简单方法是:
除了,虽然不是很明显或者没有很好的记录,但是这会给
y
中的重复索引带来问题。对于这些情况,有ufunc.at
方法(numpy中的元素操作被实现为“ufunc”或“通用函数”)。引用the docs:所以在你的情况下:
不幸的是,就矢量化技术而言,
ufunc.at
的效率相对较低,因此与循环相比的加速可能没有那么令人印象深刻。你知道吗方法#1这是一种单线性向量化方法,使用^{} 和^{} -
解释:举一个小例子来了解发生了什么-
输入:
首先,我们创建分布在dW第二轴长度上的
y
索引的2D掩码。你知道吗设
dW
为4 x 5
形数组。所以,面具应该是:这里使用^{} 来创建
2D
掩码。你知道吗接下来,我们使用矩阵乘法对
y
中的相同索引求和-因此,对应于在第二列和第三列具有
True
值的掩码的第三行,我们将用该矩阵乘法从X
求第二行和第三行的和。这将作为乘法输出的第三行。你知道吗因为在原始循环代码中,我们正在跨列更新
dW
,所以我们需要转置乘法结果,然后更新。你知道吗方法#2这里有另一种矢量化方法,尽管不是使用^{} 的一行-
相关问题 更多 >
编程相关推荐