避免数据值赋值循环

避免数据值赋值循环

问题描述:

所以这是我之前提出的一个小问题: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秒?你能想到更快的方法吗?

+1

这对codereview.stackexchange.com更合适。 – chepner 2013-03-06 20:30:39

我可能没有完全理解你的不同网格的形状,但你也许可以消除使用这样的cc循环:

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

这当然假定final_grid开始,没有其他信息(即你增加的数量从零开始)。而且我不确定如何测试它是否工作并不理解您的rowcol阵列如何工作。

+0

感谢您的建议!这个小技巧将运行时间缩短到4.5秒! – HyperCube 2013-03-06 21:49:07

+0

如果您再想一想,也可以避免通过'ii'循环,但我不确定如何。 – askewchan 2013-03-06 21:57:15

我认为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()) 

我希望这会有所帮助。

+1

+1没有想到'bincount'的方法,但它很有意义。不能'histogram2d'被用来做同样的事情吗? – Jaime 2013-03-06 21:54:10

+0

是的,直方图2d可能更适合这个问题。 – 2013-03-06 21:56:00

+0

也谢谢你这篇文章!我确实可以用它来加速它! – HyperCube 2013-03-11 14:56:31