用:-1和None切片-每个语句是什么意思?

时间:2019-06-01 10:25:18

标签: python arrays numpy numpy-slicing

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

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

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]切片是什么意思?

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

1 个答案:

答案 0 :(得分:1)

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

当我试图了解新的行为时,我希望从一个具体且易于理解的示例开始,因此,我将从一个一维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字面量(我没有看到更好的名称),并且解释器会为它们创建slice objects。如文档所述,切片对象主要是包含三个值的容器,它们分别是 start stop slice ,并且取决于每个对象的{ {1}}方法如何解释它们。您可能会发现this question有助于进一步了解切片。

利用现在所知道的,您应该能够理解第一个问题的答案。

__getitem__

将使用包含两个元素的切片调用result = train[:-1, 1:-1] 。这等效于

train.__getitem__

第一个语句可以被理解为“除temp = train[:-1] result = temp[..., 1:-1] 的最后一行之外的所有内容都为{set temp”,第二个语句可以被理解为除第一列和最后一列以外的所有内容为“ set train”。的result”。 temp

train[:-1]

并将array([[1, 2, 3, 4], [5, 6, 7, 8]]) 下标应用于该数组的第二维,得到

[1:-1]

array([[2, 3], [6, 7]]) 下标第一维上的省略号表示“通过所有内容”,因此temp [...] the subscript expression [:] can be considered equivalent to无{{ 1}}无. As far as the 0 values are concerned, a slice has a maximum of three data points: _start_, _stop_ and _step_. A 1 value for any of these gives the default value, which is x [无:无:无] for _start_, the length of the indexed object for _stop_, and x [0:len(x):1] for _step. So x [::]`。

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