在所有N+= 行之后添加print(N) 行,并尝试各种Z 数组。
例如
定义一个小的z,中间有一个1块:
In [29]: z = np.zeros((10,10),int)
In [31]: z[4:6,4:6]=1
In [34]: z[4:8,5]=1
In [35]: z
Out[35]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
将其传递给函数:
In [36]: iterate(z)
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. 2. 2. 1. 0. 0. 0.]
[ 0. 0. 0. 2. 3. 3. 2. 0. 0. 0.]
[ 0. 0. 0. 2. 4. 4. 3. 0. 0. 0.]
[ 0. 0. 0. 1. 4. 3. 3. 0. 0. 0.]
[ 0. 0. 0. 0. 2. 1. 2. 0. 0. 0.]
[ 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
N 已经统计了为 1 的邻居的数量。请自己检查计数。
Out[36]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
尝试各种模式,重复迭代并观察模式变化。有些会消失,有些会按顺序移动,有些会“眨眼”,等等。
在一行中:
N[1:, 1:] += Z[:-1, :-1]
RHS 是左上角部分(这里是 9x9); LHS 是右下角,同样是 9x9。有 8 个N+= 表达式,计算 8 个邻居(在 3x3 块中,减去中心)。通过这种偏移切片,它可以一次计算Z 中的所有点。
首先,1 行数组可能更易于可视化
In [47]: z = np.zeros((1,10),int)
In [49]: z[0,4:7]=1
In [50]: z
Out[50]: array([[0, 0, 0, 0, 1, 1, 1, 0, 0, 0]])
In [51]: iterate(z)
[[ 0. 0. 0. 1. 1. 2. 1. 1. 0. 0.]]
Out[51]: array([[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]])
我认为如果z 的所有边值都为 0,这种方法效果最好。
此数组创建在https://en.wikipedia.org/wiki/Glider_(Conway%27s_Life) 上动画的glider
In [64]: z = np.zeros((10,10),int)
In [65]: z[1,2]=1;z[2,3]=1;z[3,1:4]=1