避免数据值赋值循环
问题描述:
所以这是我之前提出的一个小问题:Generate coordinates inside Polygon和我的回答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
阵列“数据”只包含为每个多边形的数据值(80000 )。数组“row”和“col”包含多边形中坐标的行号和列号(形状:(80000,16))。如您所见,我正在总结每个网格单元格内的所有数据值并计算匹配的数量。因此,如果不同的多边形相交,我知道每个网格单元格的平均值。 仍然,这两个for循环如何花费大约7秒?你能想到更快的方法吗?
答
我可能没有完全理解你的不同网格的形状,但你也许可以消除使用这样的cc
循环:
final_grid = np.empty((nrows,ncols))
for ii in xrange(len(data)):
final_grid[row[ii,:],col[ii,:]] = data[ii]
这当然假定final_grid
开始,没有其他信息(即你增加的数量从零开始)。而且我不确定如何测试它是否工作并不理解您的row
和col
阵列如何工作。
答
我认为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())
我希望这会有所帮助。
这对codereview.stackexchange.com更合适。 – chepner 2013-03-06 20:30:39