Что матрица ** 2 означает в python / numpy? - PullRequest
13 голосов
/ 29 августа 2009

У меня есть 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 мс и, безусловно, стоит моего времени.
Спасибо! Оператор ** не гуглится и я ничего не знаю! а

Ответы [ 3 ]

14 голосов
/ 29 августа 2009

Это просто квадрат каждого элемента.

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

печать

[[0 1]
 [4 9]]
5 голосов
/ 29 августа 2009

Вы должны прочитать NumPy для пользователей Matlab . Там упоминается поэлементная операция мощности, и вы также можете видеть, что в 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]]
4 голосов
/ 29 августа 2009

** - это оператор повышения в Python, поэтому x**2 означает «квадрат в квадрате» в Python, включая numpy. Такие операции в numpy всегда применяют элемент за элементом, поэтому x**2 возводит в квадрат каждый элемент массива x (независимо от количества измерений), как, скажем, x*2 будет удваивать каждый элемент, или x+2 будет увеличивать каждый элемент на два (в каждом случае правильное x не изменяется - в результате создается новый временный массив той же формы, что и x!).

Редактировать : поскольку @ kaizer.ze указывает на то, что то, что я написал, относится к numpy.array объектам, это не относится к numpy.matrix объектам, где умножение означает умножение матриц, а не элемент на операция элемента, как для array (и аналогично для повышения до мощности) - действительно, это ключевое различие между двумя типами. Как говорится в Scipy, , например:

Когда мы используем numpy.array или numpy.matrix есть разница. A * x будет в последнем случае матрицей продукт, а не элементарный продукт как с массивом.

То есть, как указывает numpy ссылка :

Матрица - это специализированный двумерный массив которая сохраняет свою 2-ю природу операции. Это имеет определенные особые операторы, такие как * (матрица умножение) и ** (матричная мощность).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...