首页 > 解决方案 > numpy 中的自定义 dtype 用于纬度,经度用于更快的距离矩阵/克里金法/IDW 插值计算

问题描述

我有两个 2-D Numpy 数组坐标点的纬度和经度 asc_cords 和 dsc_cords 每个大小 (400000, 2)。

我需要以最快的方式计算距离矩阵。

由于内存限制,使用 vanilla numpy 无法加快速度。所以我决定使用 numba (参考我之前的问题

目前我使用与此类似的东西,在 12 核、16GB 上,它可以将速度从 40 分钟提升到 60 秒。

@nb.njit((nb.float64[:, :], nb.float64[:, :]), parallel=True)
def f2(d0, d1):
    print('Numba with parallel')
    res = np.empty((d0.shape[0], d1.shape[0]), dtype=d0.dtype)
    for i in nb.prange(d0.shape[0]):
        for j in range(d1.shape[0]):
            res[i, j] = np.sqrt((d0[i, 0] - d1[j, 0])**2 + (d0[i, 1] - d1[j, 1])**2)
    return res

但我注意到还有一个问题,我用于纬度和经度 np.float64 类型

np.finfo('float64')
# finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)

精确到小数点后 16 位是很好的,但 1e+308 是不可取的。由于纬度、经度在 (-180, 180) 之间变化,因此永远无法达到 e+308。我想创建一个新的 numpy 数据类型,它具有与 float64 相同的精度,但最大介于 (-e+6, 1e+6) 之间,希望它能显着减少计算时间。

  1. 我是在正确的轨道上(比如尝试制作自定义 dtype)还是不可能?(PS 我很难找到一篇解决类似问题的文章)

  2. 如果我是,那么我应该如何在 numpy 或 numba 中制作自定义 dtype 也可以?

标签: pythonperformancenumpygeospatialnumba

解决方案


推荐阅读