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

时间:2016-07-24 20:53:47

标签: python numpy indexing python-2.x

说:

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

arr2d[:, :1]给了我

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

arr2d[:,0]给了我

array([1, 4, 7])

我认为他们会产生完全相同的东西。

3 个答案:

答案 0 :(得分:5)

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

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

所以:

1)

print arr2d[:, 0].shape

输出:

(3L,)

2)

print arr2d[:, 0:1].shape

输出:

(3L, 1L)

我仍然没有得到它,为什么它们不会返回相同的东西?

考虑:

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,)会有点出乎意料且不一致。

答案 1 :(得分:2)

使用列表,您的行为与您描述的相同:

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

numpy的添加引入了axis,这使得它更不直观。

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

使用numpy,对于前者,您将选择第一列中返回一个轴数组的所有项目(比预期的索引编制的父项轴数少一个),但是在第二种情况下,您正在切割原始数组,结果仍然保留父数组的原始尺寸。

答案 2 :(得分:1)

索引':1'暗示:

'从index 0index 0'的项目的列表这显然是1项的清单。

索引'0'暗示:

' index 0'。

上的项目

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

arr2d[:, :1]表示对应于所有行的数据以及列0到0和#39;的列表。

结果是列表清单。

arr2d[:, 0]表示与所有行和第一列相对应的数据'。

所以这只是一个清单。