Python中的数组[0]和数组[0:1]有什么区别?

Python中的数组[0]和数组[0:1]有什么区别?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我的问题可能看起来太简单了,但我想知道为什么Python中可以使用这一点 假设我们定义了一个大小为(4,3)的数组: 结果如下: array([[ 7, 6, 1], [ 5, 3, 6], [12, 10, 11], [ 1, 3, 4]]) 以下两者之间的区别是什么: a[0] Result: array([7, 6, 1]) 及 由于它们都返回矩阵的相同部分: 7, 6, 1 我知道不同的是前者的形状是(3),而后者的大小是(1

我的问题可能看起来太简单了,但我想知道为什么Python中可以使用这一点

假设我们定义了一个大小为(4,3)的数组:

结果如下:

array([[ 7,  6,  1],
       [ 5,  3,  6],
       [12, 10, 11],
       [ 1,  3,  4]])
以下两者之间的区别是什么:

a[0]

Result:
array([7, 6, 1])

由于它们都返回矩阵的相同部分:

7, 6, 1
我知道不同的是前者的形状是(3),而后者的大小是(1,3)。
但我的问题是为什么我们需要这些形状。如果您熟悉Matlab,使用冒号给出一个范围可以得到两行,但在Python中,它返回的信息相同,形状不同。重点是什么?优点是什么?

原因是您可以确信array[x:y]总是返回原始数组的子数组。这样您就可以使用它上面的所有数组方法。说你有

map(lambda1, array[x:y])

即使
y-x==1
y-x==0
,也可以保证从
array[x:y]
返回一个数组,并且可以对其进行映射。想象一下,如果
array[1:2]
返回单个项目,即
array[1]
。那么,上面代码的行为取决于数组[1]是什么,它可能不是您想要的。

我相信您所困惑的是,在python中,当您对数组进行拼接时,它包含开始索引,但不包含结束索引。我相信在Matlab中,开始索引和结束索引都是包含的

因此,对于您给出的示例:
a[0:1]
将采用索引0,而不是1

但是,如果您使用
a[0:2]
,您将得到索引0和1处的值,并得到您似乎期望的结果

这也解释了形状不同的原因,[0:1]正是您所期望的。它提供了一个行列表,但该列表仅包含一行,因此形状
(1,3)
中的
1

相反,[0]只提供一行,而不是行列表。行有3个元素,因此您得到了形状
(3,)
array[m:n]
返回一个数组,
array[0]
返回数组的一个元素(我保证,这也与NumPy有关,请继续阅读):

>py-3
win32上的Python 3.6.5(v3.6.5:f59c0932b4,2018年3月28日,17:00:18)[MSC v.1900 64位(AMD64)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>数组=[1,2,3]
>>>数组[0]
1.
>>>数组[0:1]
[1]
>>>
这就是为什么会得到这些结果:

a[0]
结果:

结果:


如果仔细观察,第二个返回一个包装数字列表的
数组
,而第一个返回一个包装数字列表的
数组。

simple_matrix = [[0,1,2],[3,4,5],[6,7,8]]
以下代码正在打印此列表列表中的单个元素:

print (simple_matrix[0])
打印的元素是一个列表,这是因为简单_矩阵索引0处的元素只是一个列表:

与下面的示例一样,使用切片不会返回单个元素,而是返回两个元素。 在这种情况下,更简单的方法是将元素列表作为返回,这正是我们看到的结果:

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数组将产生一个与原始数组共享内存的数组。请小心,因为修改此切片也会修改原始切片

Python切片是半开的,而Matlab切片是闭的0:1
在Matlab中是
0:0
。由于使用了错误的切片,您需要两行。您错过了一个重要的区别:双括号
[…]]
。这意味着
[[7,6,1]]
是一个数组,其中单个元素是由3个元素组成的数组。这是一个嵌套数组。在Python中,
arr[0]
返回第一个元素,而
arr[x:y]
返回从索引x到索引y-1的子数组。仅对Numpy数组为真,对吗@freakish?@Pitto No,对所有数组都是如此。@Pitto这是因为您没有从列表开始。看看OP示例中的
a
是什么。是的,用于列表,但这是一个NumPy数组。它看起来很像一个列表,但它不是一个列表。很好的观点。我正在更新细节。但逻辑是完全相同的。你同意吗?
array([[7, 6, 1]])
simple_matrix = [[0,1,2],[3,4,5],[6,7,8]]
print (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]]