python - 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) 之间,希望它能显着减少计算时间。
我是在正确的轨道上(比如尝试制作自定义 dtype)还是不可能?(PS 我很难找到一篇解决类似问题的文章)
如果我是,那么我应该如何在 numpy 或 numba 中制作自定义 dtype 也可以?
解决方案
推荐阅读
- r - 如何使用 R 中的转换日期数据创建面板数据集?
- php - Laravel 5.2 有条件登录
- macos - 在 macOS 上运行 FlightFinder Blazor
- java - IntelliJ 如何在不编译的情况下运行 .java 文件?
- css - 与背景颜色混合的文本
- plsql - 使用 pl/sql 中的函数计算男女学生
- python - selenium 无法使用 python 重新加载页面
- google-apps-script - 是否可以从 App Script 代码查询配额限制的当前状态?
- android - 从 Android 上的其他应用接收图像共享
- java - setValueAt 用于 JTable Multiarray 中的复选框值