Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在numpy中执行多种方法_Python_Performance_Numpy_Interpolation_Mean - Fatal编程技术网

Python 在numpy中执行多种方法

Python 在numpy中执行多种方法,python,performance,numpy,interpolation,mean,Python,Performance,Numpy,Interpolation,Mean,早上好, 我正在实施克雷斯曼过滤器,用于在Numpy中进行距离加权平均。。我使用球树实现(感谢Jake VanderPlas)返回请求数组中每个点的位置列表。。查询数组(q)是[n,3]的形状,在每个点上都有x,y,z,我想对树中存储的点进行加权平均。。环绕树的代码返回一定距离内的点,因此我得到一个可变长度数组。。 我使用where来查找非空条目(即影响半径内至少有一些点的位置),创建isgood数组 然后我循环所有查询点以返回self.z值的加权平均值(注意,这可以是dims=1或dims=2

早上好, 我正在实施克雷斯曼过滤器,用于在Numpy中进行距离加权平均。。我使用球树实现(感谢Jake VanderPlas)返回请求数组中每个点的位置列表。。查询数组(q)是[n,3]的形状,在每个点上都有x,y,z,我想对树中存储的点进行加权平均。。环绕树的代码返回一定距离内的点,因此我得到一个可变长度数组。。 我使用where来查找非空条目(即影响半径内至少有一些点的位置),创建isgood数组

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

所以,使用map或其他更快的方法所能解决的问题是,阵列在自身距离和自身位置内的长度不均匀性。。。我对numpy/python还是相当生疏,但我想不出一种方法来实现这一数组方式(即不返回循环)

所以。。。有没有关于如何加速循环的提示


对于一个典型的映射,用于将天气雷达数据从距离、方位角、仰角网格映射到笛卡尔网格,其中我有240x240x34个点和4个变量,需要99秒来查询树(由Jake用C和cython编写。这是一个困难的步骤,因为您需要搜索数据!)和100秒来进行计算。。。我认为哪一个比较慢??我的头顶在哪里?np.mean是有效的还是被称为数百万次的,这里有加速吗?我会通过使用float32而不是default64获得收益吗。。。或者甚至缩放到整数(这将很难避免在权重中出现环绕…感谢您的任何提示!

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

关键是将平滑参数与数据相匹配(我建议使用接近数据点之间平均间距的值)。了解平滑参数后,可以将“影响半径”设置为等于权重函数降至0.01(或任何值)的半径


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

您是否尝试在代码上运行探查器?尝试在循环外预计算roi2和dist2,并使用乘法(r[isgood]*r[isgood])代替**。使用np.empty代替np.zero。只需使用time.time()和timeit进行简单的计时测试…是的。我引用了你的OBAN(DWA vrs linear,即Vaghan和Mohr)论文:)。。。换成巴恩斯就是改变重量的函数形式。。。编写此代码的要点是重新排序的不灵活性。。。最后我想用它来校准雷达网络。。。这将适用于点的任意分散和查询点的任意集。。例如,获取站点上方的列非常快速和简单。。。
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