在处理更复杂的数组切片时遇到麻烦

问题描述

我正在研究the 100 numpy exercise list。其中一个问题要求您设计一个所有数组,然后添加一个0的边框。

有两种解决方法。第一个很有意义(仅使用.pad方法,等等),第二个则依赖于更复杂的切片。为此给出的代码如下:

import numpy as np

Z = np.ones((5,5)) 
Z[:,[0,-1]] = 0
Z[[0,-1],:] = 0
print(Z)

任何人都可以帮我弄清楚这段代码中发生了什么吗?我尝试过使用它,但是更改它的某些方式并没有很多直观的意义。例如,如果我只删除第2行,似乎没有任何变化?但是,如果我将第3行中的第二个值从-1更改为3,则会发生很多变化。

作为次要附录,有人可以向我解释为什么np.ones方法需要两组括号吗?

解决方法

  • 第1行:制作一个形状为(5,5)的1的数组(因此有两组括号:一组用于调用函数,一组用于提供形状元组)。
  • 第2行:将第一个和最后一个(索引-1)设置为0。拆开切片::表示“第一维中的所有内容”(即所有行) [0,-1]的意思是“第一个和最后一个”(您可以使用NumPy中的列表或数组进行索引,而不仅仅是整数)。
  • 第3行:将第一个和最后一个设置为0。
  • 第4行:打印出来。

如果删除第2行,则有些变化,请再次查看。