1

所以这是我之前问题的一个小后续问题:在多边形内部生成坐标和我的答案https://stackoverflow.com/a/15243767/1740928 事实上,我想将多边形数据合并到常规网格中。因此,我计算了多边形内的几个坐标,并将它们的纬度/经度组合转换为它们各自的网格列/行组合。

目前,行/列信息存储在一个numpy数组中,其行数对应于数据多边形的数量,其列数对应于多边形中的坐标。

整个代码不到一秒钟,但这段代码是目前的瓶颈(大约 7 秒):

for ii in np.arange(len(data)):
    for cc in np.arange(data_lats.shape[1]):
        final_grid[        row[ii,cc], col[ii,cc] ] += data[ii]
        final_grid_counts[ row[ii,cc], col[ii,cc] ] += 1

数组“data”只包含每个多边形(80000)的数据值。数组“row”和“col”包含多边形中坐标的行号和列号(形状:(80000,16))。如您所见,我正在汇总每个网格单元格中的所有数据值并计算匹配数。因此,我知道每个网格单元的平均值,以防不同的多边形相交。不过,这两个 for 循环怎么会花费大约 7 秒呢?你能想出更快的方法吗?

4

2 回答 2

2

我认为 numpy 应该添加一个 nd-bincount 函数,我有一个来自我前一段时间正在从事的项目的一个项目。

import numpy as np

def two_d_bincount(row, col, weights=None, shape=None):
    if shape is None:
        shape = (row.max() + 1, col.max() + 1)
    row = np.asarray(row, 'int')
    col = np.asarray(col, 'int')

    x = np.ravel_multi_index([row, col], shape)
    out = np.bincount(x, weights, minlength=np.prod(shape))
    return out.reshape(shape)

weights = np.column_stack([data] * row.shape[1])
final_grid = two_d_bincount(row.ravel(), col.ravel(), weights.ravel())
final_grid_counts = two_d_bincount(row.ravel(), col.ravel())

我希望这有帮助。

于 2013-03-06T21:48:50.360 回答
1

我可能不完全理解不同网格的形状,但您可以cc使用以下方法消除循环:

final_grid = np.empty((nrows,ncols))
for ii in xrange(len(data)):
    final_grid[row[ii,:],col[ii,:]] = data[ii]

这当然假设final_grid没有其他信息开始(您递增的计数从零开始)。而且我不确定如何测试它是否有效,不了解您的rowcol数组的工作方式。

于 2013-03-06T20:47:32.163 回答