摆脱 scipy 的坑中:用 numpy 保持散列统计数据网格化管理

手头上有中国地区900百帕高宽比上的某時刻溫度uci数据集,这一uci数据集包含3个数组:经度数组、纬度数组、溫度数组。各数组值域范畴给出:东经28.644232° ~ 177.3808°,北纬度3.2973719° ~ 59.27192°,溫度205.01515°K ~ 366.69788°K,总共18952个统计数据点,散列在1个倒三角地区内。

data = np.load(r’D:\XufiveGit\CSDN\data\giirse.npz’)
lon = data[‘lon’]
lat = data[‘lat’]
tmp = data[‘tmp’]
http://caishendaka.cn/index.php?upcache=1
lon.shape, lat.shape, tmp.shape
((18952,), (18952,), (18952,))

lon.min(), lon.max(), lat.min(), lat.max()
(28.644232, 177.3808, 3.2973719, 59.27192)

tmp.min(), tmp.max()

(205.01515, 366.69788)

将这种统计数据绘图在等经伟平面图上,看上去是那样的:

import matplotlib.pyplot as plt

plt.scatter(lon, lat, s=1, c=tmp, cmap=plt.cm.hsv)

plt.show()

顾客规定将全部地区网格化管理,并将散列统计数据相匹配到邻近的格点上,网格图精密度为0.2°(经度纬度同样)。最开始,人们应用 scipy 的插值控制模块 interpolate 出示的格点插值涵数 griddata 来保持,但实际效果不符顾客规定,且速率也慢得没法接纳。griddata 的method 主要参数有3个选择项:邻近点、线形、三阶样条,图为是 griddata 各自应用线性插值(linear)和三阶样条插值(cubic)保持的实际效果(邻近点插值实际效果更差)。

import numpy as np

from scipy.interpolate import griddata

import matplotlib.pyplot as plt

lats, lons = np.mgrid[3.2:59.6:0.2, 28.6:177.6:0.2]

z = griddata((lon,lat), tmp, (lons, lats), method=‘linear’) # 能够替换成为‘cubic’

plt.pcolor(lons, lats, z, cmap=plt.cm.hsv)

plt.show()

试着了各种各样方式,均以不成功结束的。迫不得已,只能用c编码写了1个dll,再用 python 启用,尽管编码构造繁琐了许多,贵在实际效果、速率能够满足客户需求要求。以后的两年中,许多新项目里边,因此必须散列统计数据网格化管理的地区,无一例外,都启用了这一动态性联接库。

最近又碰到了一样的要求,恰好時间也较为富裕,就花了几日的思绪,总算用 numpy 保持了散列统计数据的网格化管理。還是以刚刚的uci数据集为例,详细编码给出:

lats, lons = np.mgrid[3.2:59.6:0.2, 28.6:177.6:0.2]

lon_1 = np.floor((lon-28.6)/0.2).astype(np.int)

lat_1 = np.floor((lat-3.2)/0.2).astype(np.int)

z = np.empty(lons.shape)

z.fill(np.nan)

z[(lat_1, lon_1)] = tmp

够简易吧?关键的是,更快到难以置信的程度!把我散列统计数据和格点统计数据用得样的方式画在一张照片上,实际效果给出:

plt.subplot(211)

plt.scatter(lon, lat, s=1, c=tmp, cmap=plt.cm.hsv)

plt.axis([25, 185, 3, 60])

plt.subplot(212)

plt.scatter(lons.ravel(), lats.ravel(), s=1, c=z.ravel(), cmap=plt.cm.hsv)

plt.axis([25, 185, 3, 60])

plt.show()

————————————————

上一篇:JS 百度地图 地图线路描绘


下一篇:常用坐标系简介以及转换(附在线转换工具及代码)