在numpy中执行许多手段

时间:2011-06-03 15:23:57

标签: python performance numpy interpolation mean

早上好, 我在Numpy中使用Cressman过滤器来进行距离加权平均。我使用Ball Tree implimentation(感谢Jake VanderPlas)返回请求数组中每个点的定位列表..查询数组(q)是形状[n,3]并且在每个点都有x,y,z在点I我想对树中存储的点进行加权平均..包裹在树周围的代码返回一定距离内的点,所以我得到一个数组可变长度数组.. 我使用where来查找非空条目(即影响半径内至少有一些点的位置)创建isgood数组......

然后我循环遍历所有查询点以返回值self.z的加权平均值(请注意,这可以是dims = 1或dims = 2以允许多个共网格化)

所以使用map或其他更快的方法合成的事情是self.distances和self.locations中数组长度的不均匀性...我仍然相当绿色numpy / python但我想不出一个方法这样做数组(即不回复循环)

self.locations, self.distances = self.tree.query_radius( q, r, return_distance=True)
t2=time()
if debug: print "Removing voids"
isgood=np.where( np.array([len(x) for x in self.locations])!=0)[0]
interpol = np.zeros( (len(self.locations),) + np.shape(self.z[0]) )
interpol.fill(np.nan)
for dist, ix, posn, roi in zip(self.distances[isgood], self.locations[isgood], isgood, r[isgood]):
    interpol[isgood[jinterpol]] = np.average(self.z[ix], weights=(roi**2-dist**2) / (roi**2 + dist**2), axis=0)
    jinterpol += 1

所以......有关如何加速循环的任何提示吗?..

对于典型的映射,应用于将天气雷达数据从范围,方位角,仰角网格映射到笛卡尔网格,其中我有240x240x34点和4个变量需要99s来查询树(由Jake在C和cython中编写..这是艰难的一步,因为你需要搜索数据!)和100秒进行计算......在我看来这很慢?我的开销在哪里? np.mean是高效还是被称为数百万次,这里有加速吗?我会通过使用float32而不是default64来获得...甚至缩放到整数(这将很难避免在加权中包裹...任何提示感激地收到!

1 个答案:

答案 0 :(得分:0)

您可以在以下网址找到关于Cressman方案与使用高斯权重函数的相对优点的讨论:

http://www.flame.org/~cdoswell/publications/radar_oa_00.pdf

关键是将平滑参数与数据匹配(我建议使用接近数据点之间平均间距的值)。一旦知道了平滑参数,就可以将“影响半径”设置为等于权重函数下降到0.01(或其他)的半径。

速度有多重要?如果您愿意,您可以为一些固定数量的半径增量组成一个离散的权重表,而不是调用指数函数来确定权重,这样可以大大加快计算速度。理想情况下,您应该拥有网格边界之外的数据,这些数据可用于映射网格点周围的值(甚至在网格的边界点上)。请注意,这不是真正的插值方案 - 它不会准确地返回数据点处的观测值。就像Cressman方案一样,它是一个低通滤波器。