生命游戏中的步长技巧

日期2010-10-18 (最后修改), 2010-10-18 (创建)

这类似于 [:../SegmentAxis:Segment axis],但适用于具有 2D 窗口的 2D 数组。

生命游戏是由英国数学家约翰·霍顿·康威在 1970 年发明的元胞自动机,参见 [1]。

它由一个矩形网格的细胞组成,这些细胞要么是死的,要么是活的,以及一个更新细胞状态的转换规则。为了更新网格中的每个细胞,需要检查 8 个相邻细胞的状态,即希望有一种简单的方法来访问所有细胞的 8 个相邻细胞,而无需进行不必要的复制。下面的代码片段展示了如何使用巧妙的步长技巧来实现这一目的。

[1] 生命游戏 在维基百科上

在 [7]
import numpy as np
from numpy.lib import stride_tricks
x = np.arange(20).reshape([4, 5])
xx = stride_tricks.as_strided(x, shape=(2, 3, 3, 3), strides=x.strides + x.strides)
在 [8]
x
Out[8]
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
在 [9]
xx
Out[9]
array([[[[ 0,  1,  2],
         [ 5,  6,  7],
         [10, 11, 12]],

        [[ 1,  2,  3],
         [ 6,  7,  8],
         [11, 12, 13]],

        [[ 2,  3,  4],
         [ 7,  8,  9],
         [12, 13, 14]]],


       [[[ 5,  6,  7],
         [10, 11, 12],
         [15, 16, 17]],

        [[ 6,  7,  8],
         [11, 12, 13],
         [16, 17, 18]],

        [[ 7,  8,  9],
         [12, 13, 14],
         [17, 18, 19]]]])
在 [11]
xx[0,0]
Out[11]
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12]])
在 [12]
xx[1,2]
Out[12]
array([[ 7,  8,  9],
       [12, 13, 14],
       [17, 18, 19]])
在 [13]
x.strides
Out[13]
(40, 8)
在 [14]
xx.strides
Out[14]
(40, 8, 40, 8)

章节作者: RobertCimrman