我刚刚接触过numpy并且刚刚听说过大步,但是我很难让我的脑袋如何使用它们。我有一个非常慢的小循环,它似乎是一个很好的例子,可能适用于步幅。
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]
该行:
data = band.ReadAsArray( 0, 0, width, height ).astype(np.float)
将图像的一个波段读入浮点数组。 ds
是图像的句柄,如:
ds = gdal.Open('test.tif')
答案 0 :(得分:3)
好的,让我们一步一步地做。
你有:
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]
为清晰起见,我们将其拆分为两个循环
sumw = 0.0
for i in range(width-lag):
for j in range(height-lag):
sumw += data[i+lag,j]-data[i,j]
sumh = 0.0
for j in range(height-lag):
for i in range(width-lag):
sumh += data[i,j+lag]-data[i,j]
我们可以将data[i,j+lag]
写为data[:-lag,lag:][i,j]
,data[i,j]
为data[:-lag,:-lag][i,j]
(我们的i
和j
范围,并假设滞后!= 0)。所以我们的循环变成了:
sumw = 0.0
for i in range(width-lag):
for j in range(height-lag):
sumw += data[lag:,:-lag][i,j]-data[:-lag,:-lag][i,j]
sumh = 0.0
for j in range(height-lag):
for i in range(width-lag):
sumh += data[:-lag,lag:][i,j]-data[:-lag,:-lag][i,j]
但现在我们注意到我们所有的循环只是在一个简单的索引[i,j]
上迭代,所以我们可以完全展平它们:
sumw = (data[lag:,:-lag] - data[:-lag,:-lag]).sum()
sumh = (data[:-lag,lag:] - data[:-lag,:-lag]).sum()
通过发现差异的总和是总和的差异,可以更快地做到这一点:
sumw = data[lag:,:-lag].sum() - data[:-lag,:-lag].sum()
sumh = data[:-lag,lag:].sum() - data[:-lag,:-lag].sum()
此时,您可以直观地思考整体任务:
您想要sumw
作为绿色轮廓的总和减去红色轮廓的总和,sumh
作为蓝色轮廓的总和减去红色轮廓的总和。
在这里,我们可以进行两种简化之一:
我们注意到第一笔中的大部分元素都是从第二笔中删除的。事实上,唯一不属于这种情况的因素是
[:lag]
和[-lag:]
。所以这就变成了:
sumw = data[-lag:,:-lag].sum() - data[:lag,:-lag].sum()
sumh = data[:-lag,-lag:].sum() - data[:-lag,:lag].sum()
lag < len(data) / 2
提供的速度会更快。在此,我们设置了sumw = green - (red + magenta)
和sumh = blue - (red + yellow)
我们注意到第二个总和是重复的,所以
sum_shared = data[:-lag,:-lag].sum()
sumw = data[lag:,:-lag].sum() - sum_shared
sumh = data[:-lag,lag:].sum() - sum_shared