numpy数组切片未预期的结果

时间:2013-05-18 18:59:59

标签: python numpy

我不明白下面的行为。 numpy数组通常可以通过索引来访问,所以[:,1]应该等同于[:] [1],或者我认为。有人可以解释为什么不是这样吗?

>>> a = np.array([[1, 2, 3], [4, 5, 6]])  
>>> a[:,1]  
array([2, 5])  
>>> a[:][1]  
array([4, 5, 6])

谢谢!

3 个答案:

答案 0 :(得分:5)

这两种形式的索引不一样。您应该使用[i, j]而不是[i][j]。即使两者都有效,第一个也会更快(见this question)。

使用两个索引[i][j]是两个操作。它执行第一个索引,然后在第一个操作的结果上执行第二个索引。 [:]只返回整个数组,因此您的第一个数字相当于array[1]。由于只传递了一个索引,因此假定它引用第一个维度(行),因此这意味着“获取行1”。使用一个复合索引[i, j]是一次使用两个索引条件的单个操作,因此array[:, 1]返回“所有行,第1列”。

答案 1 :(得分:1)

[:]会创建列表的副本......

因此与

基本相同
array[1] == array[:][1]

在这种情况下正确返回[4,5,6]

虽然array[:,1]表示返回第一列确实是[2,5]

例如

a = [
      [1,2,3],
      [4,5,6]
    ]

因此您可以看到第0列(a[:,0])为[1,4]而第2列(a[:,2])为[3,6]

同时a[1]指第1行(或[4,5,6]) 并且a[0]将是0行(或[1,2,3])

答案 2 :(得分:0)

>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a[:,1]
array([2, 5])

选择第二个维度(矩阵的列)并在此维度中取得元素1。以同样的方式,a[:,0]选择第一列,此处为array([1,4])a[:,2]为第三列。

如前所述,a[:]复制您的列表(是一个numpy数组或列表)。