Python:Numpy切片深入探索

时间:2017-12-05 07:18:47

标签: python numpy slice

我在康威的生命游戏克隆中找到了以下代码。 我不明白以下代码是如何运行的。有人可以对代码的执行方式进行深入解释吗?

$element.droppable({
  over: function() {
    $('body').css('cursor','copy');
  },
  out: function() {
    $('body').css('cursor','no-drop');
  },
});

1 个答案:

答案 0 :(得分:0)

在所有print(N)行之后添加N+=行,并尝试各种Z数组。

例如

在中间定义一个带有1的块的小z

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