在Python中创建一个螺旋数组?

2023-12-24

我和我的伙伴试图用 python 创建一个有趣的游戏,其中输入数组的元素以螺旋方式访问。我尝试了几种方法,如下所示(source https://stackoverflow.com/a/398302/5717589).

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 转换为螺旋数组


介绍性发言

这个问题与以螺旋顺序打印数组的问题密切相关。事实上,如果我们已经有一个函数可以做到这一点,那么问题就相对简单了。

上面有海量的资源如何产生螺旋矩阵 https://rosettacode.org/wiki/Spiral_matrix或如何loop https://stackoverflow.com/questions/398299/looping-in-a-spiral or print https://stackoverflow.com/questions/726756/print-two-dimensional-array-in-spiral-order螺旋顺序的数组。即便如此,我还是决定使用 numpy 数组编写自己的版本。这个想法不是原创的,但是使用 numpy 使代码更加简洁。

另一个原因是,我发现的大多数生成螺旋矩阵的示例(包括问题和其他答案中的代码)仅处理奇数 n 的大小为 n x n 的方阵。在其他大小的矩阵中找到起点(或终点)可能很棘手。例如,对于 3x5 矩阵,它不能是中间单元格。下面的代码是通用的,起始(结束)点的位置取决于函数的选择spiral_xxx.

Code

第一个函数按顺时针螺旋顺序解包数组:

import numpy as np

def spiral_cw(A):
    A = np.array(A)
    out = []
    while(A.size):
        out.append(A[0])        # take first row
        A = A[1:].T[::-1]       # cut off first row and rotate counterclockwise
    return np.concatenate(out)

我们可以用八种不同的方式编写这个函数,具体取决于我们从哪里开始以及如何旋转矩阵。我将给出另一个,它与问题中图像中的矩阵变换一致(稍后会很明显)。因此,进一步,我将使用这个版本:

def spiral_ccw(A):
    A = np.array(A)
    out = []
    while(A.size):
        out.append(A[0][::-1])    # first row reversed
        A = A[1:][::-1].T         # cut off first row and rotate clockwise
    return np.concatenate(out)

怎么运行的:

A = np.arange(15).reshape(3,5)
print(A)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

print(spiral_ccw(A))
[ 4  3  2  1  0  5 10 11 12 13 14  9  8  7  6]

请注意,结束(或开始)点不是中间单元格。该函数适用于所有类型的矩阵,但我们需要一个辅助函数来生成螺旋指数:

def base_spiral(nrow, ncol):
    return spiral_ccw(np.arange(nrow*ncol).reshape(nrow,ncol))[::-1]

例如:

print(base_spiral(3,5))
[ 6  7  8  9 14 13 12 11 10  5  0  1  2  3  4]

现在两个人来了主要功能。一种将矩阵变换为相同维度的螺旋形式,另一种则恢复变换:

def to_spiral(A):
    A = np.array(A)
    B = np.empty_like(A)
    B.flat[base_spiral(*A.shape)] = A.flat
    return B

def from_spiral(A):
    A = np.array(A)
    return A.flat[base_spiral(*A.shape)].reshape(A.shape)

Examples

矩阵 3 x 5:

A = np.arange(15).reshape(3,5)
print(A)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

print(to_spiral(A))
[[10 11 12 13 14]
 [ 9  0  1  2  3]
 [ 8  7  6  5  4]]

print(from_spiral(to_spiral(A)))
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

问题的矩阵:

B = np.arange(1,26).reshape(5,5)
print(B)
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]

print(to_spiral(B))
[[21 22 23 24 25]
 [20  7  8  9 10]
 [19  6  1  2 11]
 [18  5  4  3 12]
 [17 16 15 14 13]]

print(from_spiral(to_spiral(B)))
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]

Remark

如果您只打算使用固定大小的矩阵,例如 5x5,那么值得替换base_spiral(*A.shape)在具有固定索引矩阵的函数的定义中,例如Ind (where Ind = base_spiral(5,5)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中创建一个螺旋数组? 的相关文章

随机推荐

  • 具有多种 monad 类型的 Haskell do 子句

    我正在 Haskell 中使用一个名为的图形库三便士 GUI http hackage haskell org package threepenny gui 在这个库中 主函数返回一个UI http hackage haskell org
  • 取np.average而忽略NaN?

    我有一个形状为 64 17 的矩阵 对应于时间和纬度 我想取加权纬度平均值 我知道 np average 可以做到这一点 因为与我用来平均经度的 np nanmean 不同 可以在参数中使用权重 但是 np average 不会像 np n
  • 将包含 NSString 的 NSArray 转换为 NSString

    所以 我有一个包含 NSString 的 NSArray 如何将 NSArray 转换为 NSString 用换行符分隔它们 Use 通过字符串连接的组件 https developer apple com library mac docu
  • 使用 R 进行多线程?

    正在阅读R 项目 http www r project org 网站上 有一些 不清楚的 关于 R 多线程的参考 但尚不清楚基础产品和CRAN http cran cnr berkeley edu 库已编译 革命分析 http www re
  • Bootstrap:如何在一行上创建一系列 div 隐藏溢出的 div

    我有一个使用 bootstrap 构建的网站 我想使用 jquery dragscroll 插件创建一个带有可滑动标题的表格 但保留内置的流体网格 bootstrap 所以我想创建表的标题 并且我使用以下 HTML div class ro
  • 发送ajax请求而不等待应答

    我想发出一个ajax请求来发送一些信息 并在发送后立即 如果我收到错误 成功并不重要 进行重定向 无需等待服务器响应 我想知道我是否做类似的事情 ajax url myurl timeout 500 success function doc
  • 未找到名称为“ARTShape”的视图的组件

    只是试图生成一个在 React Native 中使用 ART 对象的 hello world 我得到了上述异常 就好像库的一部分没有链接一样 我刚刚添加了以下代码 import AppRegistry StyleSheet Text Vie
  • 为 QHeaderView 提供的类实现paintSection

    protected virtual void paintSection QPainter painter const QRect rect int logicalIndex const QHeaderView paintSection pa
  • 针对页面修改黑客的 Rails 集成测试?

    我正在使用 Capybara 1 1 2 Rails 3 1 3 rspec rails 2 9 0 和 Ruby 1 9 3p0 假设一个应用程序具有标准用户和 account admin 用户 标准用户可以创建另一个标准用户 但标准用户
  • Angular2 RC5 默认 http 标头

    在 RC4 中可以扩展 Http 或 BaseRequestOptions 并向所有 http 请求添加默认标头 像这儿如何在 Angular2 中设置默认 HTTP 标头 https stackoverflow com questions
  • Java try-catch 模式中的 try-finally

    每当我需要在 Java 中获取资源 然后保证资源被释放时 可能会抛出异常 我会使用以下模式 try Resource resource null try resource new Resource Use resource finally
  • 如何在Windows Azure云服务器上转发端口

    您好 我刚刚尝试了 Windows Azure 云服务器 下载并运行 apache 它可以在本地主机上运行 但无法从互联网访问 我应该端口转发做一些特别的事情才能使 cloudapp net 像 Web 服务器一样工作 我缺少什么 你究竟尝
  • 使用 Javascript 从 Google Analytics API 获取综合浏览量

    我在使用 JavaScript 从 Google Analytics API 获取数据时遇到问题 我似乎无法获取任何东西 但可以说它是一些基本的东西 比如页面浏览量 我在用分析 js https developers google com
  • 从轨道中的整数或小数中去除逗号

    整数或小数是否有等效的 gsub gsub 应该使用整数吗 基本上我只是想将十进制输入到 ruby 形式以及用户能够使用逗号的内容 例如 我希望用户能够输入 1 000 99 我尝试过使用 before save strip commas
  • SQL WHERE 条件不等于?

    是否可以否定 where 子句 e g DELETE FROM table WHERE id 2 你可以这样做 DELETE FROM table WHERE id NOT IN 2 OR DELETE FROM table WHERE i
  • 调整 Eigen::Ref 大小的解决方法

    我想使用 Eigen Ref 来使用 Eigen Matrix 参数来实现非模板函数 我的问题是 在这些函数中 我可能必须调整 Eigen Ref 引用的矩阵的大小 我知道 一般而言 不应调整 Eigen Ref 的大小 因为它可以映射到表
  • 如何水平对齐多个图像(连续)?

    如何水平对齐多个图像 它们不必适合宽度屏幕 相反 我想让它们超过后者的宽度 如果这有意义的话 我检查了类似问题的很多答案 但找不到任何可以解决我的问题的答案 Html div img src Content Images Personal
  • Crystal Report:“文件对于附件来说太大”错误

    我是水晶报表服务器的新手 我在这里解释错误的详细信息 我正在使用 SAP Business Objects CMC 为我的应用程序生成报告 下面是图像中的版本详细信息 当我尝试生成文件大小超过 1MB 的报告文件时 它会抛出以下错误 Err
  • 如何在 Facebook Marketing API 上检查营销活动的交付状态

    我正在用 Python 做一个关于这个的小应用程序 我使用的是 effective status 字段 但它仅显示它是否已暂停 我想检查活动是否正在运行 Thanks effective status 为您提供此活动的有效状态 对于 Cam
  • 在Python中创建一个螺旋数组?

    我和我的伙伴试图用 python 创建一个有趣的游戏 其中输入数组的元素以螺旋方式访问 我尝试了几种方法 如下所示 source https stackoverflow com a 398302 5717589 def spiral X Y