作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序垂直拉伸(stretch)一个 Numpy 数组,代表一个 180 x 360 的 map 图像,因此它代表一个 Web Mercator map 图像。
我编写了一个函数(如下),它可以完成我想要的操作 - 但它非常慢(大约需要五分钟)。有没有更快、更简单的方法来做到这一点?也许使用 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
最佳答案
尽量避免内部 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 循环也可以矢量化,但我想这要困难得多。
关于python - 使用 Numpy 转换为 Web 墨卡托,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25058880/
[上下文:java 8,spring boot 1.5.1] 我们正在创建一个 RESTful 服务,我们需要能够上传大文件。我想要的是一个看起来像这样的 api @RequestLine("POST
我是一名优秀的程序员,十分优秀!