给定一个n
by n
matrix M
,在 rowi
和 column j
,我想以圆形螺旋遍历所有相邻值。
这样做的目的是测试某个函数 ,f
它取决于 M ,以找到(i, j)
返回f
的半径True
。所以,f
看起来像这样:
def f(x, y):
"""do stuff with x and y, and return a bool"""
并会这样称呼:
R = numpy.zeros(M.shape, dtype=numpy.int)
# for (i, j) in M
for (radius, (cx, cy)) in circle_around(i, j):
if not f(M[i][j], M[cx][cy]):
R[cx][cy] = radius - 1
break
circle_around
以圆形螺旋返回(迭代器)索引的函数在哪里。因此,对于 中的每个点,此代码将计算并存储从返回M
的那个点开始的半径。f
True
如果有更有效的计算方式R
,我也会对此持开放态度。
更新:
感谢所有提交答案的人。我编写了一个简短的函数来绘制circle_around
迭代器的输出,以显示它们的作用。如果您更新答案或发布新答案,您可以使用此代码来验证您的解决方案。
from matplotlib import pyplot as plt
def plot(g, name):
plt.axis([-10, 10, -10, 10])
ax = plt.gca()
ax.yaxis.grid(color='gray')
ax.xaxis.grid(color='gray')
X, Y = [], []
for i in xrange(100):
(r, (x, y)) = g.next()
X.append(x)
Y.append(y)
print "%d: radius %d" % (i, r)
plt.plot(X, Y, 'r-', linewidth=2.0)
plt.title(name)
plt.savefig(name + ".png")
结果如下
plot(circle_around(0, 0), "F.J")
:
plot(circle_around(0, 0, 10), "WolframH")
:
我将 Magnesium 的建议编码如下:
def circle_around_magnesium(x, y):
import math
theta = 0
dtheta = math.pi / 32.0
a, b = (0, 1) # are there better params to use here?
spiral = lambda theta : a + b*theta
lastX, lastY = (x, y)
while True:
r = spiral(theta)
X = r * math.cos(theta)
Y = r * math.sin(theta)
if round(X) != lastX or round(Y) != lastY:
lastX, lastY = round(X), round(Y)
yield (r, (lastX, lastY))
theta += dtheta
plot(circle_around(0, 0, 10), "magnesium")
:
如您所见,满足我正在寻找的界面的结果都没有产生一个圆形螺旋,该螺旋覆盖了 0、0 附近的所有索引。FJ 是最接近的,尽管 WolframH 的命中点正确,只是不是螺旋命令。