为什么 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,)
。
有点出乎意料和不一致
说:
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,)
。