我比較喜歡這個numpy
爲基礎的解決方案:
>>> import numpy
>>> def nearest_grid(x, y, radius=1):
... X, Y = numpy.mgrid[-radius:radius + 1, -radius:radius + 1]
... return numpy.dstack((X + x, Y + y))
...
>>> nearest_grid(1, 2)
array([[[0, 1],
[0, 2],
[0, 3]],
[[1, 1],
[1, 2],
[1, 3]],
[[2, 1],
[2, 2],
[2, 3]]])
這裏有一個高度概括的版本,接受任意數量的座標。這不會將退貨清單分成網格;它只是返回一個簡單的鄰居列表。
>>> def nearest_grid(*dims, **kwargs):
... radius = kwargs.get('radius', 1)
... width = radius * 2 + 1
... dims = (d - radius for d in dims)
... return list(itertools.product(*(xrange(d, d + width) for d in dims)))
...
>>> nearest_grid(1, 2, 3, radius=1)
[(0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4),
(0, 3, 2), (0, 3, 3), (0, 3, 4), (1, 1, 2), (1, 1, 3), (1, 1, 4),
(1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 3), (1, 3, 4),
(2, 1, 2), (2, 1, 3), (2, 1, 4), (2, 2, 2), (2, 2, 3), (2, 2, 4),
(2, 3, 2), (2, 3, 3), (2, 3, 4)]
請注意,這些都以您請求的相反順序返回索引。從表面上看,這僅僅意味着您只需要顛倒參數的順序 - 即通過(y, x)
或(z, y, x)
而不是(x, y)
或(x, y, z)
。我可以爲你做這個,但是用這種方法觀察問題。
>>> def nearest_grid(x, y, radius=1):
... X, Y = numpy.mgrid[-radius:radius + 1, -radius:radius + 1]
... return numpy.dstack((Y + y, X + x))
...
>>> grid
array([[[0, 0],
[1, 0],
[2, 0]],
[[0, 1],
[1, 1],
[2, 1]],
[[0, 2],
[1, 2],
[2, 2]]])
現在我們有一個網格,其中的值以[x, y]
的順序存儲。當我們將它們用作grid
的索引時會發生什麼?
>>> grid = nearest_grid(1, 1)
>>> x, y = 0, 2
>>> grid[x][y]
array([2, 0])
我們沒有得到我們預期的細胞!這是因爲與佈局,像這樣的網格:
grid = [[(x, y), (x, y), (x, y)],
[(x, y), (x, y), (x, y)],
[(x, y), (x, y), (x, y)]]
grid[0]
給我們的第一行,即y = 0
行。所以,現在我們要顛倒順序:
>>> grid[y][x]
array([0, 2])
更好的存儲值行主((y, x)
)順序。
對於xrange(-r,r + 1)中dy的xrange(-r,r + 1)中的dx,您還可以使用更緊湊的版本:[(x + dx,y + dy)] – pmoleri 2012-07-16 14:38:59
我道歉花了這麼長時間來接受這個答案。 – sdasdadas 2012-08-10 16:10:10