python中A [0]和A [0:1] numpy数组之间的差异

时间:2018-05-05 23:00:11

标签: python arrays numpy

我有一个像这样的numpy数组:

candidates = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
        0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1],
       [1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
        0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]])

我不明白candidates[0]

之间有什么区别
candidates[0] = 

array([1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
       0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]

candidates[0].shape = (34,)

candidates[0:1]

candidates[0:1] = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]])

candidates[0:1].shape = (1, 34)

因为我相信两者应该给出完全相同的结果?我的意思是后者ie candidates[0:1]应该只代表第一个元素,对吗?那么,这两者究竟有什么不同?

3 个答案:

答案 0 :(得分:6)

在Python中,[0]索引 -it返回第一个元素,而[0:1]切片 -it返回所有的前1个元素。

使用简单的旧列表可能更容易看到:

>>> lst = [1, 2, 3]
>>> lst[0]
1
>>> lst[0:1]
[1]

Numpy扩展了Python索引和切片,其中一些会给你一个2D结果,原因各不相同 - 例如,你可以用[0]索引为“类似数组”,它可以作为一个索引数组),但相关的基础知识在这里是相同的。对于2D numpy数组,元素是行,因此candidates[0]是第一行 - 一维数组,而candidates[0:1]是所有前1行 - 一个2D数组的数组。因此,第一个具有形状(34,),第二个具有形状(1, 34)

如果你不仔细观察,差异可能并不明显,但比较两者的开始:

array([1,
array([[1,

它们没有排成一行,因为第二个有两个括号而不是一个,这是因为它是一个2D数组而不是一维。

答案 1 :(得分:2)

不同之处在于维数:candidates[0:1]将返回一个二维数组,而candidates[0]将返回一维数组:

>>> candidates[0:1].ndim
2
>>> candidates[0].ndim
1

你也可以"看" candidates[0:1]输出的维数:注意数组周围方括号的数量?这些可以暗示数组的维数

答案 2 :(得分:2)

没有。不同之处在于阵列的形状。在第一个实例中,您有一个1维的数组。在第二个中,您有一个2维数组。

您可以通过测试数组的shape属性进行测试:

print(np.array([[1, 0]]).shape)
(1, 2)

print(np.array([1, 0]).shape)
(2,)

通过使用项目列表对数组进行切片,例如: [0:1],您的结果会有一个额外的维度。注意这与使用范围无关;当您使用包含1个元素的列表作为索引器时也是如此:

x = np.array([[0, 1], [2, 3]])

print(x[[0]].shape)
# (1, 2)