Python Numpy:乘以1的向量

Python Numpy:乘以1的向量,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我目前正在学习计算机科学教科书中的一些概念。线性代数被大量使用,他们在教科书中展示的例子都使用Numpy 特别是一个表达让我完全困惑,因为它似乎是一个完全无用的表达。从课本上一字不差地抄下来,上面写着: normalisers=sum(exp(输出),axis=1)*one(1,shape(输出)[0]) 因此,为了简化,我将删除exp(它与此处的问题无关),这为我们提供了: sum(输出,轴=1)*one((1,形状(输出)[0])) 其中,输出是一个二维Numpy数组(矩阵) 据我所知,这只

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

特别是一个表达让我完全困惑,因为它似乎是一个完全无用的表达。从课本上一字不差地抄下来,上面写着:

normalisers=sum(exp(输出),axis=1)*one(1,shape(输出)[0])

因此,为了简化,我将删除
exp
(它与此处的问题无关),这为我们提供了:

sum(输出,轴=1)*one((1,形状(输出)[0]))

其中,
输出
是一个二维Numpy
数组
(矩阵)

据我所知,这只是将
输出
矩阵中的所有行相加,然后将得到的向量元素乘以所有1的向量。所以这里乘以所有的1有什么意义?它根本不会改变这些值


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

正如mutzmatron在评论中所写的那样,当
输出
是一个数组时,这种乘法是一种非常人为的方法,可以将
求和
的结果的形状从
(n,)
(1,n)
。快速且惯用的方法是

sum(exp(outputs), axis=1).reshape(1, -1)
与教科书中的方式不同,这既可读又可扩展,因为
重塑
需要恒定的时间和内存,而不是线性的时间和内存

但是,如果
输出
不是数组而是可怕类型的对象
np.matrix
,则结果完全不同:

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

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

正如mutzmatron在评论中所写,当
输出
是一个数组时,这种乘法是一种高度人为的方式,可以将
求和结果的形状从
(n,)
更改为
(1,n)
。快速且惯用的方法是

sum(exp(outputs), axis=1).reshape(1, -1)
与教科书中的方式不同,这既可读又可扩展,因为
重塑
需要恒定的时间和内存,而不是线性的时间和内存

但是,如果
输出
不是数组而是可怕类型的对象
np.matrix
,则结果完全不同:

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

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

这会将结果从(dim,)向量更改为(1,dim)矩阵吗。。?虽然不可否认我不会这样做!我想它以后会有所不同,一个矩阵是(n,)还是(1,n)大小…这会把(dim,)向量的结果变成(1,dim)矩阵吗。。?虽然不可否认我不会这样做!我认为它以后会有所不同,无论矩阵是(n,)还是(1,n)大小。。。