[英]What is differnces between array[0] and array[0:1] in Python?
我的问题似乎太简单了,但我很好奇为什么要在Python中使用它。
假设我们定义了一个大小为(4,3)的数组:
import numpy as np
a=np.random.randint(15,size=(4,3))
结果将如下所示:
array([[ 7, 6, 1],
[ 5, 3, 6],
[12, 10, 11],
[ 1, 3, 4]])
之间的区别是什么?
a[0]
Result:
array([7, 6, 1])
和
a[0:1]
Result:
array([[7, 6, 1]])
由于它们都返回矩阵的相同部分:
7, 6, 1
我确实知道区别在于形状,因为前者的形状为(3,),而后者的尺寸为(1,3)。 但是我的问题是,为什么我们需要具有这种形状。 如果您熟悉Matlab,则使用冒号指定范围会给您两行,但是在Python中,它会以相同的形状返回相同的信息。 有什么意义? 有什么好处?
原因是您可以确信array [x:y]总是返回原始数组的子数组。 这样就可以使用所有的数组方法。 说你有
map(lambda1, array[x:y])
即使yx == 1
或yx == 0
,也可以确保从array[x:y]
返回一个数组,并且可以对其进行映射。 想象一下,如果array[1:2]
相反返回了一个项目,即array[1]
。 然后,上述代码的行为取决于array [1]是什么,并且可能不是您想要的。
我相信您感到困惑的是,在python中,当您采用数组的拼接时,它包含开始索引,但不包含结束索引 。 我相信在Matlab中,开始索引和结束索引都是包含在内的。
因此,对于您给出的示例: a[0:1]
将采用索引0,而不是1。
但是,如果您使用a[0:2]
,则将获得索引0和1处的值,并获得您似乎期望的结果。
这也解释了形状为何不同的原因,a [0:1]完全按照您的期望进行。 这是给你行的名单,但名单只包含1列,因此1
在造型(1, 3)
相反,a [0]仅给您单行,而不是行列表。 该行包含3个元素,因此形状为(3,)
array[m:n]
返回一个数组, array[0]
返回该数组的一个元素(这也与NumPy的东西有关,我保证,请继续阅读):
> py -3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> array = [1,2,3]
>>> array[0]
1
>>> array[0:1]
[1]
>>>
这就是为什么您得到这些结果的原因:
a[0]
结果:
array([7, 6, 1])
和
a[0:1]
结果:
array([[7, 6, 1]])
如果你仔细看,第二返回一个array
,它包装号码清单列表 ,而第一返回一个array
,它包装号码列表 。
我将尝试用一个简化的例子来解释。
simple_matrix = [[0,1,2],[3,4,5],[6,7,8]]
以下代码从该列表列表中打印单个元素:
print (simple_matrix[0])
打印的元素是一个列表,这是因为simple_matrix索引0处的元素仅是一个列表:
>>> [0,1,2]
像下面的示例一样,切片的使用不返回单个元素,而是返回两个元素。 在这种情况下,将元素列表期望为返回值更为简单,而这正是我们所看到的结果:
print (simple_matrix[0:2])
>>> [[0, 1, 2], [3, 4, 5]]
这个输出似乎使您感到困惑:
print simple_matrix[0:1]
>>> [[0, 1, 2]]
之所以得到此输出,是因为在这种情况下,您不会像在第一个示例中那样从列表中获得单个元素,而是因为您要对列表列表进行切片。
该切片返回包含切片元素的列表,在这种情况下,仅返回列表[0,1,2]。
冒号表示法是切片的简写,因此从一些简短的例子开始,简要说明术语。 我将向您推荐这个很好的答案,以便从总体上了解切片的工作原理。 这与我称之为“访问符号”或访问诸如a[0]
的数组元素形成对比。
因此,在您的情况下,不同之处在于您可以在维度0处访问 n维数组,这将返回该行中的一系列列。 相反, 将您的n维数组从0 切片到1会得到一个包含维0的列表,但不包括1,这将是一个二维数组,其中第一个(也是唯一一个)元素是其中的一系列列第一行。
关于形状,这取决于您对数据的处理方式。 例如,如果您需要一次访问多个行,则一次使用一个更大的切片可能更有意义,而访问符号则需要多个语句或一个循环。
关于Numpy数组的说明
切片传统的一维数组将始终产生原始数组的一个子集, 作为副本 。 相反,对n维NP数组进行切片将产生一个视图 ,该视图与原始数组共享内存。 请注意,修改此切片也会修改原始切片!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.