为什么numpy数组arr2d [:, 1]和arr2d [:,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])
我以为他们会产生完全一样的事情。
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,)
。
与列表,你有你所描述的相同的行为:
>>> a = [1, 2, 3, 4]
>>> a[0]
1
>>> a[:1]
[1]
与numpy
加入是引进axis
这使得它有点不太直观。
在第一种情况下,你返回一个项目在一个特定的指数,在第二种情况下,你返回列表中分得一杯羹。
随着numpy
,对于前者,你选择其中返回一个轴阵列的第一列中的所有项目(是比母体的轴的数量少一个,与索引预期),但在第二种情况下,您正在对原始数组进行切片,结果仍然保留了父数组的原始尺寸。
指数':1'
意味着:
'项目从index 0
到index 0
的名单' 这显然是1项的列表。
指数'0'
意味着:
'的项目在index 0
'。
把这个扩展到你的问题应该会使你获得的结果非常清晰。
arr2d[:, :1]
表示'对应于所有行的数据和列0到0的列表'。
所以结果是列表的列表。
arr2d[:, 0]
表示'数据对应于所有行,只是第一列'。
所以它只是一个列表。
数字'1'和列表'[1]'有什么区别? – Mephy
目前尚不清楚为什么你认为他们会一样。序列的片段与该序列中的项目不同。 – jonrsharpe
第一个是选择一系列的列,所以它不会改变no。昏暗,而第二个选择一列,从而减少不。 '1'的暗淡。 – Divakar