为什么 numpy 数组 arr2d[:, :1] 和 arr2d[:, 0] 会产生不同的结果?

Why do numpy array arr2d[:, :1] and arr2d[:, 0] produce different results?

说:

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

arr2d[:, :1] 给我

array([[1],
       [4],
       [7]])

arr2d[:,0] 给我

array([1, 4, 7])

我以为他们会生产完全一样的东西。

对于列表,您的行为与您描述的相同:

>>> a = [1, 2, 3, 4]
>>> a[0]
1
>>> a[:1]
[1]

numpy的加法是axis的引入,这使得它不太直观。

在第一种情况下,您返回特定索引处的项目,在第二种情况下,您返回列表的一部分。


使用 numpy,对于前者,您要选择第一列中的所有项目 returns 单轴数组(比父级的轴数少一个作为预期有索引),但在第二种情况下,您正在对原始数组进行切片,结果仍保留父数组的原始尺寸。

索引':1'表示:

'The list of items from index 0 to index 0' 这显然是 1 项的列表。

索引'0'表示:

'The item at index 0'.

将其扩展到您的问题应该会使您获得的结果非常清楚。

arr2d[:, :1] 表示 'data corresponding to all rows and the list of columns 0 to 0'。

所以结果是列表的列表。

arr2d[:, 0] 表示 'data corresponding to all rows and just the first column'。

所以这只是一个列表。

1) 当你说 arr2d[:, 0] 时,你是说给我 arr2d 中所有行的第 0 个索引(这是给我第 0 列的另一种说法)。

2) 当你说 arr2d[:, :1] 时,你是说给我 arr2d 中所有行的所有 :1 索引。 Numpy 对 :1 的解释与对 0:1 的解释相同。因此,您说的是 "for each row, give me the 0th through first index (exclusive) of each row"。结果这只是第 0 个索引,但您明确要求第二个维度的长度为 1(因为 0:1 只是 "length" 一个)。

所以:

1)

print arr2d[:, 0].shape

输出:

(3L,)

2)

print arr2d[:, 0:1].shape

输出:

(3L, 1L)

我还是不明白,他们为什么不return同样的东西?

考虑:

print arr2d[:, 0:3]
print arr2d[:, 0:3].shape

print arr2d[:, 0:2]
print arr2d[:, 0:2].shape

print arr2d[:, 0:1]
print arr2d[:, 0:1].shape

这输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
(3L, 3L)

[[1 2]
 [4 5]
 [7 8]]
(3L, 2L)

[[1]
 [4]
 [7]]
(3L, 1L)

最后一个形状是 (3L,)

有点出乎意料和不一致