Numpy:乘以一个1的矢量



我目前正在学习计算机科学教科书中的一些概念。线性代数被大量使用,他们在教科书中展示的例子都使用了Numpy。

有一个表达方式让我完全困惑,因为它似乎是一个完全无用的表达方式。逐字复制自课本,上面写着:

normalisers = sum(exp(outputs),axis=1)*ones((1,shape(outputs)[0]))

因此,为了简化起见,我将删除exp(它与这里的问题无关),这给了我们:

sum(outputs,axis=1)*ones((1,shape(outputs)[0]))

其中CCD_ 4是2-D Numpy CCD_。

据我所知,这只是对outputs矩阵中的所有行求和,然后将所得向量逐元素乘以一个全1的向量。那么…乘以这里的所有1有什么意义?这根本不会改变价值观。

这是教科书上的错误吗,还是我没有看到乘以所有的1可能会对这里的值产生任何影响?在这一点上,我对Numpy只是有点熟悉,所以我不确定我是否只是误解了这个表达的一些含义。

正如mutzmatron在评论中所写,当outputs是一个数组时,这种乘法是将sum的结果形状从(n,)更改为(1,n)的一种非常巧妙的方式。快速且惯用的方法是

sum(exp(outputs), axis=1).reshape(1, -1)

与教科书中介绍的方式不同,这既可读又可扩展,因为reshape占用的是常数而不是线性时间和内存。

然而,如果outputs不是一个数组,而是一个可怕类型np.matrix的对象,那么结果就完全不同了:

>>> outputs = np.matrix(outputs)
>>> (sum(exp(outputs), axis=1) * ones((1,shape(outputs)[0]))).shape
(10, 10)

(但是,这仍然是一种表达不同操作的人为方式。)

相关内容

  • 没有找到相关文章

最新更新