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

Ant*_*nio 7 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]])
Run Code Online (Sandbox Code Playgroud)

我不明白有什么区别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,)
Run Code Online (Sandbox Code Playgroud)

而且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)
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 6

在Python,[0]索引 -它返回第一元件,而[0:1]切片 -它返回所有的第一1个元件的集合.

使用普通的旧列表可能更容易看到:

>>> lst = [1, 2, 3]
>>> lst[0]
1
>>> lst[0:1]
[1]
Run Code Online (Sandbox Code Playgroud)

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

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

array([1,
array([[1,
Run Code Online (Sandbox Code Playgroud)

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