Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Numpy 不规则点二维快速插值的实现与策略_Numpy_Pytorch_Numba_Cupy - Fatal编程技术网

Numpy 不规则点二维快速插值的实现与策略

Numpy 不规则点二维快速插值的实现与策略,numpy,pytorch,numba,cupy,Numpy,Pytorch,Numba,Cupy,给定二维中大量(约1000万)不规则间隔的点,其中每个点都有与其相关联的强度(“权重”),现有的python实现有哪些用于在以下位置插值的值: 某个随机位置的特定点(即点=(0.5,0.8)) 随机位置的大量点(即点=np.random.random((1,000,2))) 整数位置的规则网格(即np.索引((10001000)).T) 我知道Delaunay三角测量经常用于此目的。有没有其他方法可以替代这种方法 是否有任何解决方案利用多个CPU核心或GPU 作为一个例子,下面是一个使用的方

给定二维中大量(约1000万)不规则间隔的点,其中每个点都有与其相关联的强度(“权重”),现有的python实现有哪些用于在以下位置插值的值:

  • 某个随机位置的特定点(即
    点=(0.5,0.8)
  • 随机位置的大量点(即
    点=np.random.random((1,000,2))
  • 整数位置的规则网格(即
    np.索引((10001000)).T
我知道Delaunay三角测量经常用于此目的。有没有其他方法可以替代这种方法

是否有任何解决方案利用多个CPU核心或GPU

作为一个例子,下面是一个使用的方法。它似乎不会使用多个CPU核心。 还有,但对于这个问题,我特别感兴趣的是,除了scipy中的解决方案之外,我还想听听其他的解决方案

#%时间标记是对特定行计时的IPython神奇函数
维_形=(10001000)#我们将随机[0-1]分布在[0-1000]上以避免浮点错误
N_点=尺寸_形状[0]*尺寸_形状[1]
已知_点=np.随机。随机((N_点,2))*尺寸_形状
已知权重=np.random.random((N个点,))
未知_点=(0.5,0.8)
未知点=np.random.random((N个点,2))*尺寸
未知网格=np。索引(维度形状,数据类型=浮点)。T.重塑(-1,2))#重塑为2D点列表
%时间tesselation=Delaunay(已知点)#创建网格以了解邻居#6秒
%time interp_func=线性间极体(细分、已知权重)#1 ms
%time interp_func(未知点)#2秒#运行一次,因为scipy函数需要编译
%时间间隔函数(未知点)~ns
%时间间隔函数(未知网格)#400毫秒
%时间间隔函数(未知点)#1分13秒
#下面我对上面的“未知点”数组进行排序,然后重试
%时间ind=np.lexsort(np.transpose(未知点)[::-1])306毫秒
未知点排序=未知点[ind]。复制()

%time interp_func(unknown_points_sorted)#19秒Scipy非常好,我认为Python中没有更好的解决方案,但我可以添加一些可能对您有帮助的东西。首先,你对点进行排序的想法非常好。所谓的“增量算法”通过一次插入一个顶点来构建Delaunay。在现有网格中插入顶点的第一步是确定要将其插入网格中的哪个三角形。为了加快速度,一些算法在最近的插入点开始搜索。因此,如果对点进行排序,使插入的每个点与上一个点相对接近,则搜索速度会快得多。如果您想了解更多详细信息,可以查阅“劳森行走”算法。在我自己的Delaunay实现中(它是Java的,所以我担心它对您没有帮助),我有一个基于Hilbert空间填充曲线的排序。希尔伯特排序非常有效。但即使只是按x/y坐标排序也是有帮助的


至于是否有其他方法不使用Delaunay插值。。。您可以尝试使用反向距离权重(IDW)。IDW技术不需要Delaunay,但它们确实需要某种方法来确定哪些顶点靠近要插值的点。我已经将坐标空间划分为等距的容器,将顶点存储在适当的容器中,然后通过查看相邻的容器来拉起插值所需的点。这可能需要大量的编码,但它会相当快,并且比Delaunay使用更少的内存。在Delaunay三角形上插值当然是一种可能性,但我建议将点排序为a,使用树查询最近的邻居(在足够大的半径内),然后使用插值,正如已经建议的那样