我是新来的纽比,刚刚听说了跨步,但我很难弄清楚如何使用它们。我有一个很慢的小循环,它似乎是一个很好的例子,可能会有很大的进步。在
def semivariogram( ds, band, lag ):
width = ds.RasterXSize
height = ds.RasterYSize
data = band.ReadAsArray( 0, 0, width, height ).astype(np.float)
#print 'w: {}, h: {}'.format(width, height)
sumw = 0.0
sumh = 0.0
for i in range(width-lag):
for j in range(height-lag):
sumw += data[i+lag,j]-data[i,j]
sumh += data[i,j+lag]-data[i,j]
Nh2 = 2.0*(width-lag)*(height-lag)
return [sumw/Nh2, sumh/Nh2, (sumw/Nh2+sumh/Nh2)/2.0]
行:
^{pr2}$将图像的一个波段读入浮点数组。并且ds
是一个像这样的图像的句柄:
ds = gdal.Open('test.tif')
好吧,让我们一步一步来。在
你有:
为了清楚起见,我们把它分成两个循环
^{pr2}$我们可以把}(对于我们的范围},并假设滞后!=0)。所以我们的循环变成:
data[i,j+lag]
写成data[:-lag,lag:][i,j]
,data[i,j]
是{i
和{但现在我们注意到,我们所有的循环都只是在一个简单的索引
[i,j]
上迭代,因此我们可以完全将它们展平:通过发现差的和就是和的差,可以更快地实现这一点:
此时,您可以直观地考虑整个任务:
您需要}是蓝色轮廓上的和减去红色轮廓上的和。在
sumw
作为绿色轮廓上的和减去红色轮廓上的和,而{在这里,我们可以进行两种简化:
我们注意到第一个和中的大多数元素都从第二个和中移除。事实上,唯一不是这样的元素是}。所以这就变成了:
[:lag]
和{如果
lag < len(data) / 2
,这将更快。在这里,我们设置sumw = green - (red + magenta)
,和sumh = blue - (red + yellow)
我们注意到第二个和是重复的
相关问题 更多 >
编程相关推荐