一种有效的“毛毛雨”算法?

计算科学 算法
2021-12-23 21:07:19

有哪些“毛毛雨”算法的有效实现可用?问题是,给定一个数据时间流,其中每个元素都与地图中的一个像素相关联,您如何创建该地图?每个像素可能有许多与之关联的数据点。每个数据点可能需要加权。

例如,在 python/numpy 中,给定一个数据数组d、一个权重数组w、一个映射m、一个权重映射wm和一个从 d 到 m 的映射xinds,yinds,你可以这样做:

for jj,(xx,yy) in enumerate(xinds,yinds):
    m[xx,yy] += (d*w)[jj]
    wm[xx,yy] += w[jj]
final_image = m/wm

其中xx, yy, d, 和w具有相同的长度。此外,xxyy是 matrix xy位置。

如何提高效率?是否有 python 中的工具或其他语言的库来执行此操作?我什至用正确的名字来称呼这个算法吗?

David Fanning 的网站IDL显示了使用该histogram功能的有效实现

编辑:在问了这个问题之后,我意识到我有答案......numpy.bincount在 numpy. 如果映射t = xinds + yinds*xsizewherexsize是地图的 x 维度

# shapes of x,y indices need to be flat
x,y = (a.ravel() for a in numpy.indices(m.shape))
dc = numpy.bincount(t,d*w)
wc = numpy.bincount(t,w)
m[x,y] = dc
wm[x,y] = wc

实现这个的函数

了解该算法的其他实现仍然很有用。或者也许是计算t映射和不同加权方案的方法——我上面根本没有讨论这个,但我认为在创造这个术语的上下文中(哈勃成像),确定这两个变量都涉及复杂性。

EDIT2:推论-如果我想中下毛毛雨怎么办?即,不是对最终地图进行平均,而是中位数?

(这不是有效代码,而是模糊的伪代码......你不能在 python 中拥有二维列表,尽管嵌套列表是可以的)

for jj,(xx,yy) in enumerate(xinds,yinds):
    m[xx,yy].append((d*w)[jj])
for jj,(xx,yy) in enumerate(xinds,yinds):
    m[xx,yy] = median(m[xx,yy])
1个回答

该算法很容易以 for 循环方式编写,但难以表示为一系列向量运算,这使得它非常适合用低级语言(如 C)编写并将其链接到 Python(对于以 Cython 为例)。除非有 Python 的 drizzle 库,否则这将是最快和最简单的解决方案。