在Python/Numpy中,matrix**2是什么意思?
我在阅读的一段代码中,有一个叫做python ndarray的东西,它遇到了一些问题:
x = temp**2
这里的“点乘平方”是指像m.*m这样的操作,还是“矩阵平方”,也就是说m必须是一个方阵?特别是,我想知道我是否可以在这段代码中去掉转置操作:
temp = num.transpose(whatever)
num.sum(temp**2,axis=1))
然后把它改成这样:
num.sum(whatever**2,axis=0)
这样可以让我节省至少0.1毫秒,显然值得我花时间去做。
谢谢!这个**操作符在网上找不到相关信息,我对此一无所知!
3 个回答
**
是 Python 中的幂运算符,所以 x**2
的意思就是“x 的平方”,在 Python 和 numpy 中都是这样。使用 numpy 时,这种运算会逐个元素进行,所以 x**2
会把数组 x
中的每个元素都平方(无论这个数组有多少维度)。比如,x*2
会把每个元素都乘以 2,x+2
则会把每个元素都加上 2(在这几种情况下,x
本身不会改变,结果会是一个新的临时数组,形状和 x
一样!)。
补充说明:正如 @kaizer.ze 指出的那样,我所说的适用于 numpy.array
对象,但不适用于 numpy.matrix
对象。在 numpy.matrix
中,乘法是指矩阵乘法,而不是像 array
那样逐个元素的运算(幂运算也是如此)——这实际上是这两种类型之间的关键区别。正如 Scipy 教程 中所说的:
当我们使用 numpy.array 或 numpy.matrix 时,它们之间是有区别的。A*x 在后者的情况下是矩阵乘积,而不是像数组那样的逐元素乘积。
也就是说,正如 numpy 参考文档 中所提到的:
矩阵是一个特殊的二维数组,通过运算保持其二维特性。它有一些特殊的运算符,比如
*
(矩阵乘法)和**
(矩阵幂)。
你应该去看看 为Matlab用户准备的NumPy指南。里面提到了逐元素的幂运算,你还会发现,在NumPy中,有些运算符对 array
(数组)和 matrix
(矩阵)的作用是不同的。
>>> from numpy import *
>>> a = arange(4).reshape((2,2))
>>> print a**2
[[0 1]
[4 9]]
>>> print matrix(a)**2
[[ 2 3]
[ 6 11]]
这只是每个元素的平方。
from numpy import *
a = arange(4).reshape((2,2))
print a**2
打印出来的结果是
[[0 1]
[4 9]]