python - 对角蛇填充数组

标签 python arrays numpy matrix diagonal

python 3.7。我正在尝试以对角蛇模式填充多维数组(n*m 大小):

1   3   4   10  11  21
2   5   9   12  20  22
6   8   13  19  23  30
7   14  18  24  29  31
15  17  25  28  32  35
16  26  27  33  34  36

我有一个用于 n x n 大小的函数,它工作正常。但是对于 n x m 大小,它返回:

1 3  4  10 14

2 5  9  15 20

6 8  16 19 19

7 17 18 20 21

我的代码:

def method1(i, j, n, m):
    num = i+j
    summ = num * (num + 1) >> 1
    s = n * m
    if num > n-1:
        t = 2*(n-1) - (i+j) + 1
        s -= t*(t+1) >> 1

    if num & 1:
        if num > n-1:
            return s + (n-i)
        else:
            return summ + j+1
    if num > n-1:
        return s + (n-j)
    else:
        return summ + i+1

for i in range(n):
    for j in range(m):
        print(method1(i, j, n, m), end=" ")
    print('\n')

我做错了什么? 附言您的回答可以是任何语言。

最佳答案

这是一个向量化的解决方案:

def tr(z):
    return z*(z+1)//2

def snake(Y, X):
    y, x = np.ogrid[:Y, :X]
    mn, mx = np.minimum(X, Y), np.maximum(X, Y)
    return (1 + tr(np.clip(x+y, None, mn))
            + mn * np.clip(x+y - mn, 0, None)
            - tr(np.clip(x+y - mx, 0, None))
            + ((x+y) & 1) * (x - np.clip(x+y + 1 - Y, 0, None))
            + ((x+y + 1) & 1) * (y - np.clip(x+y + 1 - X, 0, None)))

演示:

>>> snake(7, 3)
array([[ 1,  3,  4],
       [ 2,  5,  9],
       [ 6,  8, 10],
       [ 7, 11, 15],
       [12, 14, 16],
       [13, 17, 20],
       [18, 19, 21]])
>>> snake(2, 4)
array([[1, 3, 4, 7],
       [2, 5, 6, 8]])

解释器:

tr 函数计算三角形中元素的数量,该三角形大约是半个正方形(稍微多一点,因为我们包括了对角线)。这在 snake 中用于计算每条对角线的偏移量;对角线由 x+y 索引。

更准确地说,return 语句中的前三行计算对角线偏移量。第一行计算左上三角形中的对角线,第二行计算全长对角线以及右下三角形中的对角线;它也将这些计算为全长 - 第三行对此进行了更正。

最后两行在对角线内计数。两个中的第一个在右上方向,第二个在左下方向。请注意,对于从左边缘开始的所有对角线,右上角的偏移量等于 x 坐标。校正项 (np.clip ...) 适用于从底部边缘开始的对角线。类似地,如果我们从顶部边缘开始,左下角偏移量为 y,如果我们从右边缘开始,则需要更正。

关于python - 对角蛇填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53173098/

相关文章:

python : Halton and Hammersley quasi random sequences

python - 以相反的顺序遍历字典 (Python)

php - 将一组数据库列添加到数组时出现问题

php - 从数组中仅获取非数字键的简单方法

c - 从C中的文件加载数据

Python 在带有 numpy 数组数据的 for 循环中附加一个列表

python - 为什么 NumPy 的随机函数在其生成的值中似乎显示出一种模式?

python - 将 Mysql 时间戳转换为 Python 的日期时间

python - 在python中获取当前控制台输出

python - 需要帮助理解这个范围函数