我已经编写了以下代码,它完全符合我的要求,但是速度太慢了。我确信有一种方法可以让它更快,但我似乎无法找到它应该如何完成。代码的第一部分只是显示什么是什么形状。
两个测量图像(VV1
和HH1
)
预先计算的值,VV
模拟和HH
模拟,它们都依赖于 3 个参数(预先计算的(101, 31, 11)
值)
索引 2 只是将VV
和HH
图像放在同一个 ndarray 中,而不是制作两个 3darray
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,但我已经搜索了很长时间,但我找不到写类似“parfor”的方法" 而不是 matlab 中的 "for",(@parallel
如果我只是将 for 循环放在单独的方法中,是否可以制作装饰器?)
编辑:回复 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循环并行?