13

我正在阅读的一些代码中有一个 python ndarray temp 受此影响:

x = temp**2

这是点方阵(即相当于m.*m)还是矩阵方阵(即m必须是方阵)?特别是,我想知道我是否可以摆脱这段代码中的转置:

temp = num.transpose(whatever)
num.sum(temp**2,axis=1))

并将其变成这样:

num.sum(whatever**2,axis=0)

这将为我节省至少 0.1 毫秒,显然值得我花时间。
谢谢!** 运算符是不可搜索的,我什么都不知道!一种

4

3 回答 3

14

它只是每个元素的平方。

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

印刷

[[0 1]
 [4 9]]
于 2009-08-29T01:54:48.343 回答
5

**是 Python 中的升幂运算符,因此在 Python 中x**2表示“x 平方”——包括 numpy. numpy 中的此类操作总是逐个元素地应用,因此x**2对数组的每个元素x(无论维数多少)进行平方就像,例如,x*2将每个元素加倍,或者x+2将每个元素增加 2(在每种情况下,x适当的不受影响 -结果是一个与x!)形状相同的新临时数组。

编辑:正如@kaizer.ze 指出的那样,虽然我写的内容适用于numpy.array对象,但它不适用于对象,其中乘法意味着矩阵乘法,而不是像 for (同样用于提升权力)numpy.matrix这样的逐元素操作——确实array,这是两种类型之间的主要区别。正如Scipy 教程所说,例如:

当我们使用 numpy.array 或 numpy.matrix 时会有所不同。A*x 在后一种情况下是矩阵乘积,而不是数组的元素乘积。

即,正如numpy 参考所说:

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

于 2009-08-29T02:04:01.297 回答
5

您应该阅读NumPy for Matlab Users。那里提到了元素幂运算,您还可以看到,在 numpy 中,某些运算符对arrayand的应用不同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]]
于 2009-08-29T15:17:41.940 回答