2016-07-24 244 views
0

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

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

arr2d[:, :1]给我

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

arr2d[:,0]给我

array([1, 4, 7]) 

我以为他们会产生完全一样的事情。

+0

数字'1'和列表'[1]'有什么区别? – Mephy

+1

目前尚不清楚为什么你认为他们会一样。序列的片段与该序列中的项目不同。 – jonrsharpe

+1

第一个是选择一系列的列,所以它不会改变no。昏暗,而第二个选择一列,从而减少不。 '1'的暗淡。 – Divakar

回答

3

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,)

2

与列表,你有你所描述的相同的行为:

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

numpy加入是引进axis这使得它有点不太直观。

在第一种情况下,你返回一个项目在一个特定的指数,在第二种情况下,你返回列表中分得一杯羹。


随着numpy,对于前者,你选择其中返回一个轴阵列的第一列中的所有项目(是比母体的轴的数量少一个,与索引预期),但在第二种情况下,您正在对原始数组进行切片,结果仍然保留了父数组的原始尺寸。

1

指数':1'意味着:

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

指数'0'意味着:

'的项目在index 0'。

把这个扩展到你的问题应该会使你获得的结果非常清晰。

arr2d[:, :1]表示'对应于所有行的数据和列0到0的列表'。

所以结果是列表的列表。

arr2d[:, 0]表示'数据对应于所有行,只是第一列'。

所以它只是一个列表。

相关问题