【发布时间】:2014-07-31 12:29:12
【问题描述】:
我的程序垂直拉伸了一个 Numpy 数组,表示一个 180 x 360 的地图图像,因此它表示一个 Web 墨卡托地图图像。
我写了一个函数(如下),它可以做我想做的事 - 但它非常慢(大约需要五分钟)。有没有更快更简单的方法来做到这一点?也许使用 Numpy interpolate2d 或 MatPlotLib?
def row2lat(row):
return 180.0/math.pi*(2.0*math.atan(math.exp(row*math.pi/180.0))-math.pi/2.0)
def mercator(geodetic):
geo = np.repeat(geodetic, 2, axis=0)
merc = np.zeros_like(geo)
side = geo[0].size
for row in range(side):
lat = row2lat(180 - ((row * 1.0)/side) * 360)
g_row = (abs(90 - lat)/180)*side
fraction = g_row-math.floor(g_row)
for col in range(side):
high_row = geo[math.floor(g_row)][col] * (fraction)
low_row = geo[math.ceil(g_row)][col] * (1-fraction)
merc[row][col] = high_row + low_row
return merc
【问题讨论】:
-
没有示例输入很难理解(至少对我而言)。然而,使 numpy 快速的经验法则不是使用 for 循环,而是对所有内容进行矢量化。
-
如果措辞令人困惑,我们深表歉意。任务很简单;垂直拉动一个 Numpy 数组,使其在顶部和底部延伸得更多。
-
您只想在数组的顶部和底部附加零吗?或者调整它的大小(就像你调整图片大小一样)?
-
顶部和底部像素的拉伸大约是它们高度的 3 倍,中心像素越多拉伸越少。就像印在焦糖上的图片。
-
我添加了显示函数作用的图像。
标签: python numpy gis matplotlib-basemap