gpt4 book ai didi

python - 如何避免在 numpy 中使用 for 循环?

转载 作者:太空狗 更新时间:2023-10-30 02:47:15 33 4
gpt4 key购买 nike

我已经编写了以下代码,它完全符合我的要求,但速度太慢了。我确信有办法让它更快,但我似乎无法找到它应该如何完成。代码的第一部分只是为了显示什么是什么形状。

两张测量图像(VV1HH1)
预计算值,VV 模拟和 HH 模拟,它们都取决于 3 个参数(为 (101, 31, 11) 值预计算)
索引 2 只是将 VVHH 图像放在同一个 ndarray 中,而不是制作两个 3darrays

VV1 = numpy.ndarray((54, 43)).flatten()
HH1 = numpy.ndarray((54, 43)).flatten()
precomp = numpy.ndarray((101, 31, 11, 2))

我们让三个参数中的两个变化

comp = numpy.zeros((len(parameter1), len(parameter2)))

for i,(vv,hh) in enumerate(zip(VV1,HH1)):
comp0 = numpy.zeros((len(parameter1),len(parameter2)))
for j in range(len(parameter1)):
for jj in range(len(parameter2)):
comp0[j,jj] = numpy.min((vv-precomp[j,jj,:,0])**2+(hh-precomp[j,jj,:,1])**2)
comp+=comp0

我知道我应该做的显而易见的事情是尽可能多地摆脱 for 循环,但我不知道如何使 numpy.min 在处理更多时正常运行维度。

第二件事(如果它可以矢量化就不那么重要了,但仍然很有趣)我注意到它主要占用 CPU 时间,而不是 RAM,但我已经搜索了很长时间,但我找不到写东西的方法就像 matlab 中的“parfor”而不是“for”,(如果我只是将 for 循环放在一个单独的方法中,是否可以制作一个 @parallel 装饰器?)

编辑:回复 Janne Karila:是的,这肯定会改进很多,

for (vv,hh) in zip(VV1,HH1):
comp+= numpy.min((vv-precomp[...,0])**2+(hh-precomp[...,1])**2, axis=2)

肯定快很多,但是有没有可能也删除外部 for 循环?有没有办法用 @parallel 之类的东西使 for 循环并行?

最佳答案

这可以替换内部循环,jjj

comp0 = numpy.min((vv-precomp[...,0])**2+(hh-precomp[...,1])**2, axis=2)

这可能是整个循环的替代品,尽管所有这些索引让我有些费解。 (虽然这会创建一个大的中间数组)

comp = numpy.sum(
numpy.min((VV1.reshape(-1,1,1,1) - precomp[numpy.newaxis,...,0])**2
+(HH1.reshape(-1,1,1,1) - precomp[numpy.newaxis,...,1])**2,
axis=2),
axis=0)

关于python - 如何避免在 numpy 中使用 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16607760/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com