在Python/Numpy中,matrix**2是什么意思?

13 投票
3 回答
31412 浏览
提问于 2025-04-15 13:57

我在阅读的一段代码中,有一个叫做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 个回答

5

** 是 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 参考文档 中所提到的:

矩阵是一个特殊的二维数组,通过运算保持其二维特性。它有一些特殊的运算符,比如 *(矩阵乘法)和 **(矩阵幂)。

6

你应该去看看 为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]]
15

这只是每个元素的平方。

from numpy import *
a = arange(4).reshape((2,2))
print a**2

打印出来的结果是

[[0 1]
 [4 9]]

撰写回答