在特定轴上运行的 Numpy power ufunc
Numpy power ufunc operating on specific axis
我觉得 numpy.power 没有轴参数很奇怪...是因为有一种 better/safer 方法可以实现相同的目标(将 3D 数组中的每个 2D 数组提升到一维数组的幂)。
假设您有一个 (3,10,10) 数组 (A),并且您想要将每个 (10,10) 数组提升到形状为 (3,) 的数组 B 中的元素的幂。
你应该可以通过使用 np.power(A,B,axis=0)
来完成,对吧?
然而它会产生以下 TypeError :
TypeError: 'axis' is an invalid keyword to ufunc 'power'
因为 power 似乎没有轴或轴参数(尽管是一个 ufunc),首选的方法是什么?
可能有一个使用 ufunc.reduce
方法的解决方案,但我真的不知道如何使用 numpy.power
...
现在我这样做了:
np.array([A[i,:,:]**B[i] for i in range(3)])
但它看起来很难看,而且效率可能不如 numpy 方法。
谢谢
power
不是 reduction 操作:它不会将数字集合减少为单个数字,因此 axis
参数不会说得通。 sum
或 max
等操作是归约,因此指定应用归约的轴是有意义的。
您想要的操作是broadcasting。这是一个较小的示例,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]]])
我觉得 numpy.power 没有轴参数很奇怪...是因为有一种 better/safer 方法可以实现相同的目标(将 3D 数组中的每个 2D 数组提升到一维数组的幂)。
假设您有一个 (3,10,10) 数组 (A),并且您想要将每个 (10,10) 数组提升到形状为 (3,) 的数组 B 中的元素的幂。
你应该可以通过使用 np.power(A,B,axis=0)
来完成,对吧?
然而它会产生以下 TypeError :
TypeError: 'axis' is an invalid keyword to ufunc 'power'
因为 power 似乎没有轴或轴参数(尽管是一个 ufunc),首选的方法是什么?
可能有一个使用 ufunc.reduce
方法的解决方案,但我真的不知道如何使用 numpy.power
...
现在我这样做了:
np.array([A[i,:,:]**B[i] for i in range(3)])
但它看起来很难看,而且效率可能不如 numpy 方法。
谢谢
power
不是 reduction 操作:它不会将数字集合减少为单个数字,因此 axis
参数不会说得通。 sum
或 max
等操作是归约,因此指定应用归约的轴是有意义的。
您想要的操作是broadcasting。这是一个较小的示例,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]]])