gpt4 book ai didi

python - 在 numpy 中执行多种方式

转载 作者:行者123 更新时间:2023-11-28 19:27:36 25 4
gpt4 key购买 nike

早上好,我正在使用 Cressman 过滤器在 Numpy 中进行距离加权平均。我使用 Ball Tree implimentation(感谢 Jake VanderPlas)返回请求数组中每个点的位置列表。查询数组(q)是形状[n,3] 并且在每个点都有 x,y,z 我想对存储在树中的点进行加权平均..围绕树的代码返回一定距离内的点所以我得到一个数组可变长度数组..我使用 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 个变量需要 99 秒来查询树(由 Jake 用 C 和 cython 编写..这是困难的一步,因为您需要搜索数据!)和 100 秒来进行计算……在我看来这很慢??我的开销在哪里? np.mean 是高效的还是被称为数百万次这里是否有加速?我会通过使用 float32 而不是默认的 64 来获得 yield 吗……甚至缩放到整数(这将很难避免在加权中回绕……感谢收到任何提示!

最佳答案

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

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

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

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

关于python - 在 numpy 中执行多种方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6229080/

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