我的程序垂直拉伸Numpy数组,表示180 x 360的地图图像,因此它代表一个Web Mercator地图图像。
我写了一个功能(下面),它做了我想要的 - 但它是疯狂的慢(需要五分钟)。有更快更容易的方法吗?也许使用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
答案 0 :(得分:1)
尽量避免内部for循环并向量化你的函数。 Numpy经过高度优化,可以高效地运行这些东西。那么你的函数就像
一样def mercator_faster(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)
# Here I optimized the code by using the numpy vector operations
# instead of the for loop:
high_row = geo[math.floor(g_row), :] * (fraction)
low_row = geo[math.ceil(g_row), :] * (1-fraction)
merc[row, :] = high_row + low_row
return merc
如果我在我的机器上运行它需要不到一秒钟的时间:
%timeit mercator_faster(geo)
1 loops, best of 3: 727 ms per loop
它看起来像这样(我不得不重新调整它,因为它太大了,不能这样做):
可能外部for循环也可能被矢量化,但我想这更难。