Что означает матрица ** 2 в python/numpy?

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

Ответ 1

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

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

печатает

[[0 1]
 [4 9]]

Ответ 2

Вы должны прочитать 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]]

Ответ 3

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

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

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

i.e., поскольку ссылка numpy указывает:

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