power
не является операцией сокращения : она не сводит набор чисел к одному числу, поэтому аргумент axis
не имеет смысла.Такие операции, как sum
или max
, являются сокращениями, поэтому имеет смысл указать ось, вдоль которой будет применяться сокращение.
Требуемая операция - широковещание .Вот меньший пример: A
имеет форму (3, 2, 2) и B
имеет форму (3,)
.Мы не можем написать np.power(A, B)
, потому что формы не совместимы для трансляции.Сначала мы должны добавить тривиальные размеры к B
, чтобы придать ему форму (3, 1, 1).Это можно сделать, например, с помощью B[:, np.newaxis, np.newaxis]
или B.reshape(-1, 1, 1)
.
In [100]: A
Out[100]:
array([[[1, 1],
[3, 3]],
[[3, 2],
[1, 1]],
[[3, 2],
[1, 3]]])
In [101]: B
Out[101]: array([2, 1, 3])
In [102]: np.power(A, B[:, np.newaxis, np.newaxis])
Out[102]:
array([[[ 1, 1],
[ 9, 9]],
[[ 3, 2],
[ 1, 1]],
[[27, 8],
[ 1, 27]]])
Значение np.newaxis
равно None
, поэтому вы часто будете видеть выражения, которые вместо этого используют None
np.newaxis
.Вы также можете использовать оператор **
вместо функции power
:
In [103]: A ** B[:, None, None]
Out[103]:
array([[[ 1, 1],
[ 9, 9]],
[[ 3, 2],
[ 1, 1]],
[[27, 8],
[ 1, 27]]])