我遇到了一个代码片段,虽然我可以看到每个语句的最终结果,但我无法理解其中的两个语句。
在给出语句之前,我将创建一个变量:
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]
切片是什么意思?
对于以上两个语句以及每个语句的读取方式,有一个替代方法将很有帮助,以便我更好地理解它。
答案 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 [::]`。
有了这些知识,您应该有更多的机会了解正在发生的事情。