Python:深入解释 Numpy 切片 [关闭]

Posted

技术标签:

【中文标题】Python:深入解释 Numpy 切片 [关闭]【英文标题】:Python: Numpy slicing indepth explnation [closed] 【发布时间】:2018-05-18 18:55:48 【问题描述】:

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

def iterate(Z):
    # find number of neighbors that each square has
    N = np.zeros(Z.shape)
    N[1:, 1:] += Z[:-1, :-1]
    N[1:, :-1] += Z[:-1, 1:]
    N[:-1, 1:] += Z[1:, :-1]
    N[:-1, :-1] += Z[1:, 1:]
    N[:-1, :] += Z[1:, :]
    N[1:, :] += Z[:-1, :]
    N[:, :-1] += Z[:, 1:]
    N[:, 1:] += Z[:, :-1]
    # a live cell is killed if it has fewer than 2 or more than 3 neighbours.
    part1 = ((Z == 1) & (N < 4) & (N > 1))
    # a new cell forms if a square has exactly three members
    part2 = ((Z == 0) & (N == 3))
    return (part1 | part2).astype(int)

【问题讨论】:

你试过reading the manual吗? 【参考方案1】:

在所有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

【讨论】:

以上是关于Python:深入解释 Numpy 切片 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

乐哥学AI_Python:Numpy索引,切片,常用函数

Python中numpy 数组的切片操作

如何修复“在解释器中至少有 1 个以 numpy 数组或切片的形式引用的内部数据”并在 tf.lite 上运行推理

Python NumPy - 3D 数组的角度切片

Python 列表理解 - numpy 数组 [关闭]

Python/Numpy - 在数组末尾环绕切片