使用 :-1 和 None 进行切片 - 每个语句的含义是什么?

Slicing with :-1 and None - What does each of the statement mean?

我遇到了一个代码片段,其中有两个语句我无法理解,但我可以看到每个语句的最终结果。

我会在给出语句之前创建一个变量:

train = np.random.random((10,100))

其中一个读作:

train = train[:-1, 1:-1]

这个切片是什么意思?如何阅读这个?我知道切片中的 -1 表示从后面开始。但是我无法理解这个。

另外声明如下:

la = [0.2**(7-j) for j in range(1,t+1)]
np.array(la)[:,None]

[:,None] 中使用 None 进行切片是什么意思?

对于以上两个语句,以及每个语句的阅读方式,有一个替代方法会有所帮助,以便我更好地理解它。

Python 的优势之一是统一应用简单明了的原则。 Numpy 索引,就像 Python 中的所有索引一样,将单个参数传递给索引对象的(,数组的)__getitem__ 方法,numpy 数组是其中之一切片机制(或至少其早期用途之一)的主要理由。

当我试图理解新行为时,我喜欢从一个具体且易于理解的示例开始,因此我将从一个 one-dimensional 4 元素向量开始,而不是 10x100 个随机值3x4,应该足够大以了解发生了什么。

simple = np.array([1, 2, 3, 4])

train = np.array([[1, 2, 3, 4],
                   [5, 6, 7, 8],
                   [9, 10, 11, 12]])

解释器将这些显示为

array([1, 2, 3, 4])

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

表达式 simple[x] 在幕后等效于(也就是说解释器最终执行)simple.__getitem__(x) - 请注意此调用采用单个参数。

numpy 数组的 __getitem__ 方法非常简单地实现了整数索引:它从第一个维度中选择一个元素。所以simple[1]2train[1]array([5, 6, 7, 8])

__getitem__ 接收到一个元组作为参数时(这就是 Python 的语法解释像 array[x, y, z] 这样的表达式的方式),它将元组的每个元素作为索引应用于连续的索引对象的维度。所以 result = train[1, 2] 等同于(概念上 - 代码在实现中更复杂)到

temp = train[1]    # i.e. train.__getitem__(1)
result = temp[2]   # i.e. temp.__getitem__(2)

果然我们发现 result 出现在 7。您可以认为 array[x, y, z] 等同于 array[x][y][z].

现在我们可以将切片添加到混音中。包含冒号的表达式可以被视为 slice literals(我还没有看到更好的名字),解释器创建 slice objects for them. As the documentation notes, a slice object is mostly a container for three values, start, stop and slice, and it's up to each object's __getitem__ method how it interprets them. You might find this question 有助于进一步理解切片。

根据你现在所知道的,你应该能够理解你第一个问题的答案。

result = train[:-1, 1:-1]

将使用 two-element 切片元组调用 train.__getitem__。这相当于

temp = train[:-1]
result = temp[..., 1:-1]

第一个语句可以读作 "set temp to all but the last row of train",第二个可以读作 "set result to all but the first and last columns of temp"。 train[:-1]

array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

并将 [1:-1] 下标应用到该数组的第二维得到

array([[2, 3],
       [6, 7]])

temp 下标第一维的省略号表示 "pass everything," 所以 the subscript expression[...]can be considered equivalent to[:]. As far as theNonevalues are concerned, a slice has a maximum of three data points: _start_, _stop_ and _step_. ANonevalue for any of these gives the default value, which is0for _start_, the length of the indexed object for _stop_, and1for _step. Sox[None:None:None ]is equivalent tox[0:len(x):1]which is equivalent tox[::]`.

有了这些知识,您应该更有机会了解正在发生的事情。