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

JJJ*_*JJJ 2 python indexing numpy python-2.x

说:

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

arr2d[:, :1] 给我

array([[1],
       [4],
       [7]])
Run Code Online (Sandbox Code Playgroud)

arr2d[:,0] 给我

array([1, 4, 7])
Run Code Online (Sandbox Code Playgroud)

我以为他们会产生完全相同的东西.

Mat*_*ith 5

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

2)当你说arr2d[:, :1],你说给我所有:1arr2d中所有行的索引.Numpy解释:1与解释相同0:1.因此,你说"对于每一行,给我每行的第0个到第一个索引(不包括").事实证明这只是第0个索引,但你明确要求第二个维度的长度为1(因为0:1只有"长度"一个).

所以:

1)

print arr2d[:, 0].shape
Run Code Online (Sandbox Code Playgroud)

输出:

(3L,)
Run Code Online (Sandbox Code Playgroud)

2)

print arr2d[:, 0:1].shape
Run Code Online (Sandbox Code Playgroud)

输出:

(3L, 1L)
Run Code Online (Sandbox Code Playgroud)

我还是不明白,他们为什么不回归同样的事情呢?

考虑:

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

这输出:

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

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

[[1]
 [4]
 [7]]
(3L, 1L)
Run Code Online (Sandbox Code Playgroud)

对于最后一个形状来说,这将是一个意想不到的和不一致的(3L,).