python - Python:将函数应用于numpy 3d数组中的每个条目
问题描述
我想在我的 3d numpy 数组上应用一个(更复杂的?)函数,形状为 x,y,z = (4,4,3)。假设我有以下数组:
array = np.arange(48)
array = array.reshape([4,4,3])
现在我想在数组的每个点上调用以下函数:
p(x,y,z) = a(z) + b(z)*ps(x,y)
假设 a 和 b 是以下 1d 数组,分别是 ps 一个 2d 数组。
a = np.random.randint(1,10, size=3)
b = np.random.randint(1,10, size=3)
ps = np.arrange(16)
ps = ps.reshape([4,4])
我直观的方法是遍历我的数组并在每个点上调用函数。它可以工作,但当然它太慢了:
def calcP(a,b,ps,x,y,z):
p = a[z]+b[z]*ps[x,y]
return p
def stupidLoop(array, a, b, ps, x, y, z):
dummy = array
for z in range (0, 3):
for x in range (0, 4):
for y in range (0, 4):
dummy[x,y,z]=calcP(a,b,ps,x,y,z)
return dummy
updatedArray=stupidLoop(array,a, b, ps, x, y, z)
有更快的方法吗?我知道它适用于矢量化函数,但我无法用我的方法弄清楚。
我实际上并没有尝试使用这些数字。这只是为了举例说明我的问题。它来自气象学世界,有点复杂。
解决方案
向量化循环,并使用广播:
a.reshape([1,1,-1]) + b.reshape([1,1,-1]) * ps.reshape([4,4,1])
编辑:
感谢@NilsWerner 提供了一种更常见的评论方式:
a + b * ps[:, :, None]
推荐阅读
- python - 按值重新格式化 pandas DataFrame 计数
- authentication - TestBenchTestCase 中的依赖注入
- elasticsearch - 如何以 JSON 格式将 nginx 日志发送到 ELK?
- java - 为什么我的流复制过程的性能会稳步下降
- postgresql - 如何使用 case 表达式,然后在 postgres sql 中语句的 else 部分使用插入语句
- kubernetes - 如何在远程浏览器而不是 localhost 机器中打开 Jaeger UI(在 Istio 中运行)
- python - 使用随机梯度下降的简单逻辑回归的 numpy 和 tensorflow 实现之间的区别
- php - mysqli_fetch_array() 期望参数 1 为 mysqli_result - 需要 helpsssss
- laravel - Laravel Eloquent 获取仅属于属于 shop 的用户的日志
- output - Azure 流分析:SQL 输出不起作用