python - Numpy power ufunc 在特定轴上运行
问题描述
我觉得奇怪的是 numpy.power 没有轴参数...是因为有更好/更安全的方法来实现相同的目标(将 3D 数组中的每个 2D 数组提升到 1D 数组的幂)。
假设您有一个 (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
不是归约操作:它不会将数字集合归约为单个数字,因此axis
参数没有意义。诸如sum
or之类的操作max
是归约,因此指定一个轴来应用归约是有意义的。
你想要的操作是广播。这是一个较小的示例,A
具有 shape (3, 2, 2) 和B
shape (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]]])
推荐阅读
- c# - 尝试从 sql 数据库中读取数据并在文本框中显示 - Visual C#(语法错误)
- javascript - 下载完成后 Django 更新模板
- javascript - 在反应中重定向到主页时出错
- rx-java - rxjava 过滤流中的项目与流中的任何其他过滤器不匹配
- amazon-web-services - 通过 ec2 上的 curl 获取实例名称?
- spring - 春季批处理中不想要 JOB_EXECUTION_PARAMS
- python - 如何根据条件将数据框中的一列切成多个系列
- omnet++ - 使用 Venes_inet 从 aodvRouter 向 adhocHost 发送消息时出错
- vue.js - 如何在换页的同时不停顿地听音乐?
- python-3.x - 如何在每行之后插入每组的最后一行