2

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

特别是一种表达方式让我完全困惑,因为它似乎是一种完全无用的表达方式。从教科书中逐字复制,它说:

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

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

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

其中outputs是 2-D Numpy array(矩阵)。

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

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

4

1 回答 1

4

正如mutzmatron 在评论中所写,whenoutputs是一个数组,这种乘法是一种高度人为的方式来改变sumfrom (n,)to的结果的形状(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)

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

于 2012-07-25T16:35:04.793 回答