繁体   English   中英

Python中array [0]和array [0:1]有什么区别?

[英]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 == 1yx == 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM