【发布时间】:2020-08-14 12:07:13
【问题描述】:
如何通过列表理解来简化这个 for 循环并获得更快的速度?
import numpy as np
import shapely
#buffer_original_points --> shapely polygons in a list
#raster --> shapely polygons in a list
raster_array = np.zeros((len(raster)))
for i in range(0, len(buffer_original_points)):
for j in range(0, len(raster)):
if buffer_original_points[i].intersects(raster[j]) or raster[j].contains(buffer_original_points[i]):
raster_array[j] += 1
raster_array = raster_array.reshape(rows, columns)
我试过这个,但是 raster_array 结果是错误的,并且被填充了:
raster_array=[raster_array[j]+1 for i in range(0, len(buffer_original_points)) for j in range(0, len(raster)) if (buffer_original_points[i].intersects(raster[j]) or raster[j].contains(buffer_original_points[i]))]
【问题讨论】:
-
这个理解只返回值,不会改变
raster_array中的值。由于您不想更改循环内的变量,因此循环似乎是正确的方法。 -
@Georgy 感谢您的支持。您能否给我一些建议以在我的情况下实施 Mike T 的解决方案?我对 Rtree 这个话题有点不知所措,不明白如何在我的情况下使用它。我的目标是建立一个矩阵,其中单元格值取决于位于栅格单元格中的点数。
-
我建议改用second answer,这样您就不必安装其他库了。通过栅格多边形列表初始化
STRtree,然后迭代buffer_original_points并使用query方法获取与当前迭代中的多边形相交的那些栅格多边形。要跟踪计数,您还可以使用collections.Counter和rasters 作为键,最后您会将其转换回计数数组。 -
@Georgy 如果我错了,请纠正我。 STRtree 被初始化为
s=STRtree(raster)。之后,我使用列表理解查询结果并将结果存储在列表result=[s.query(buffer_original_points[i] for i in range(0,len(buffer_original_points)中。然后我测试了[raster[i] in result for i in range(0,len(raster))是否有任何结果为真,但整个列表是false。对不起,我的误解,但我是新手。 -
非常感谢@Georgy。你的笔记本帮了我很大的忙!从两分钟运行时间到