2012-07-25 96 views
2

我目前正在通过计算机科学教科书中的一些概念。线性代数大量使用,他们在教科书中显示的例子都使用Numpy。Numpy:乘以一个向量

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

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

所以,我会删除exp为简化起见(这是不相关的这里的问题),这给了我们:

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

其中outputs是二维Numpy array(矩阵)。

据我所知,这只是求和outputs矩阵中的所有行,然后将得到的向量乘以所有元素的向量。那么......这里所有的乘法点都有什么意义呢?它根本不会改变这些值。

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

+2

这是否会将结果从(dim,)向量更改为(1,dim)矩阵..?虽然我不会那样做! – jmetz 2012-07-25 16:30:58

+0

我认为它可以在以后有所作为,无论矩阵是(n,)还是(1,n)大小...... – jmetz 2012-07-25 16:35:59

回答

3

如mutzmatron在评论写入,当outputs是一个数组,该乘法是从(n,)改变sum结果的形状(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)