使用 :-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]
是2
,train[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 the
Nonevalues are concerned, a slice has a maximum of three data points: _start_, _stop_ and _step_. A
Nonevalue for any of these gives the default value, which is
0for _start_, the length of the indexed object for _stop_, and
1for _step. So
x[None:None:None ]is equivalent to
x[0:len(x):1]which is equivalent to
x[::]`.
有了这些知识,您应该更有机会了解正在发生的事情。
我遇到了一个代码片段,其中有两个语句我无法理解,但我可以看到每个语句的最终结果。
我会在给出语句之前创建一个变量:
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]
是2
,train[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 the
Nonevalues are concerned, a slice has a maximum of three data points: _start_, _stop_ and _step_. A
Nonevalue for any of these gives the default value, which is
0for _start_, the length of the indexed object for _stop_, and
1for _step. So
x[None:None:None ]is equivalent to
x[0:len(x):1]which is equivalent to
x[::]`.
有了这些知识,您应该更有机会了解正在发生的事情。