[Hmmph。 @wim打我,但我已经写了下面的,所以无论如何,我会张贴]短版:
import numpy
N = 5
# get grid coords
xx, yy = numpy.mgrid[0:N,0:N]
# get the distance weights
kernel = 1 + N//2 - numpy.maximum(abs(xx-N//2), abs(yy-N//2))
with open('kernel.out','w') as fp:
# header
fp.write("{} {}\n".format(N, N))
# integer matrix output
numpy.savetxt(fp, kernel, fmt="%d")
产生的神奇
~/coding$ python kernel.py
~/coding$ cat kernel.out
5 5
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
冗长的解释:我们将首先需要的是矩阵中的每个条目的指标,为此,我们可以使用mgrid:
>>> import numpy
>>> N = 5
>>> xx, yy = numpy.mgrid[0:N,0:N]
>>> xx
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]])
>>> yy
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
因此,采取配对方式,这些是5x5阵列的每个元素的x和y坐标。中心位于N // 2,N // 2(其中//是截断除法),因此我们可以减去该距离以获得距离,并取绝对值,因为我们不关心该符号:
>>> abs(xx-N//2)
array([[2, 2, 2, 2, 2],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2]])
>>> abs(yy-N//2)
array([[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2]])
现在看看原来的网格,它看起来像你想两者的最大值:
>>> numpy.maximum(abs(xx-N//2), abs(yy-N//2))
array([[2, 2, 2, 2, 2],
[2, 1, 1, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 1, 1, 2],
[2, 2, 2, 2, 2]])
这看起来不错,但去了错误的方式。我们可以反转,虽然:
>>> N//2 - numpy.maximum(abs(xx-N//2), abs(yy-N//2))
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 2, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
,你想1索引,它看起来像,所以:
和我们有它。其他一切都是无聊的IO。
就像一个警告,如果Arc可以使用1333x1333内核处理焦点统计信息,我会感到惊讶...祝好运,无论如何! @DSM&@wim已经有了答案,但如果遇到更多问题,请随时提问。如果你知道如何将一些较低级别的函数“粘合”在一起做你想做的事,你会发现numpy(特别是你正在做的“scipy.ndimage”)能够非常有能力。据说,Python社区目前还缺乏一个好的克里金/灵活插值库。 – 2012-03-05 02:32:19
@JoeKington要给这个巨大的内核尝试看看它能做什么。如果弧失败,我可能会让它经历numpy。如果我可以使用numpy生成标准偏差为1的空间自相关DEM,那么我将全部开始。将回报! – Jzl5325 2012-03-05 11:50:03
目前正在运行模型的焦点统计部分... 49037%在6MB ASCII内核上完成...看起来像我将使用numpy实现此步骤。 – Jzl5325 2012-03-06 02:01:05