我和我的伙伴试图用python创建一个有趣的游戏,其中数组中输入的元素以螺旋方式访问。我尝试过一些方法,比如下面给出的方法(source)。
def spiral(X, Y):
x = y = 0
dx = 0
dy = -1
for i in range(max(X, Y)**2):
if (-X/2 < x <= X/2) and (-Y/2 < y <= Y/2):
print (x, y)
# DO STUFF...
if x == y or (x < 0 and x == -y) or (x > 0 and x == 1-y):
dx, dy = -dy, dx
x, y = x+dx, y+dy
上面的语句访问螺旋循环中的元素,并为定义的数组AE打印它们。我想知道如何将一个给定的数组AE转换为一个螺旋数组
您可以通过从矩阵中心附近开始并始终右转(除非已访问元素)来构建螺旋:
示例:
导言
这个问题与按螺旋顺序打印阵列的问题密切相关。事实上,如果我们已经有一个函数来完成它,那么问题就相对简单了。
在how to produce a spiral matrix或如何loop或print按螺旋顺序排列数组上有大量资源。即便如此,我还是决定用numpy数组编写自己的版本。这个想法不是原创的,但是使用numpy使代码更加简洁。
另一个原因是,我发现的生成螺旋矩阵的大多数示例(包括问题和其他答案中的代码)只处理奇数n的大小为nxn的平方矩阵。在其他大小的矩阵中找到起点(或终点)可能很棘手。例如,对于3x5矩阵,它不能是中间单元格。下面的代码是通用的,起点(终点)的位置取决于函数
spiral_xxx
的选择。代码
第一个函数按螺旋顺序顺时针展开数组:
我们可以用八种不同的方法编写这个函数,这取决于我们从哪里开始以及我们如何旋转矩阵。我将给出另一个,它与问题图像中的矩阵变换是一致的(稍后会很明显)。所以,接下来,我将使用这个版本:
工作原理:
请注意,结束(或开始)点不是中间单元格。此函数适用于所有类型的矩阵,但我们需要一个辅助函数来生成螺旋索引:
例如:
接下来是两个主要功能。一个将矩阵转换为相同维度的螺旋形式,另一个将转换还原为:
实例
矩阵3 x 5:
问题矩阵:
备注
如果只使用固定大小的矩阵,例如5x5,那么在函数定义中用索引的固定矩阵替换
base_spiral(*A.shape)
是值得的,比如Ind
(其中Ind = base_spiral(5,5)
)。这里有一个使用
itertools
的解决方案,实际上没有数学,只是观察螺旋的样子。我觉得很优雅,也很容易理解。用法:
输出:
下面是同样的解决方案:
我忽略了一个事实,你希望输入是一个2D数组,因为它对于任何1D的iterable都更有意义。如果需要,可以轻松地展平输入的二维数组。我也假设输出应该是平方的,因为我想不出你会想要什么。如果正方形的长度相等,而且输入的内容太长,则可能会超出边缘并产生错误:再说一次,我不知道替代方法是什么。
相关问题 更多 >
编程相关推荐