我有一个像这样的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]
应该只代表第一个元素,对吗?那么,这两者究竟有什么不同?
答案 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)