有哪些“毛毛雨”算法的有效实现可用?问题是,给定一个数据时间流,其中每个元素都与地图中的一个像素相关联,您如何创建该地图?每个像素可能有许多与之关联的数据点。每个数据点可能需要加权。
例如,在 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
具有相同的长度。此外,xx
和yy
是 matrix x
,y
位置。
如何提高效率?是否有 python 中的工具或其他语言的库来执行此操作?我什至用正确的名字来称呼这个算法吗?
David Fanning 的网站IDL
显示了使用该histogram
功能的有效实现
编辑:在问了这个问题之后,我意识到我有答案......numpy.bincount
在 numpy. 如果映射t = xinds + yinds*xsize
wherexsize
是地图的 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])