Numpy 的索引是倒排的

Don*_*son 4 python arrays indexing numpy

我正在忙于阅读 Wes Mckinney 的《Python for Data Analysis》,并且遇到了以下示例,该示例有点令人困惑。它涉及将多个索引数组传递给 np 数组。

给定以下 np.array

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]] 
Run Code Online (Sandbox Code Playgroud)

当我们使用以下值对数组执行花式索引时

arr[[1, 5, 7, 2], [0, 3, 1, 2]]
Run Code Online (Sandbox Code Playgroud)

以下结果

array([ 4, 23, 29, 10]) 
Run Code Online (Sandbox Code Playgroud)

这并不是我所期望的>我知道它应该返回与每个实例元组相对应的一维元素数组。它返回的实际值让我感到困惑。

我认为它应该返回的元组是 (0,1), (5,3), (7, 1), (2, 2)

应该返回 [4, 没有这样的元素, 没有这样的元素, 10]

我到底缺少什么?

unu*_*tbu 5

当您索引 2D 数组中的第一个元素 时arr,您将获得第一行:

In [119]: arr = np.array([[0,1,2],[3,4,5]])

In [120]: arr
Out[120]: 
array([[0, 1, 2],
       [3, 4, 5]])

In [123]: arr[0]
Out[123]: array([0, 1, 2])
Run Code Online (Sandbox Code Playgroud)

因此,在 NumPy-lingo 中,“0 轴”与 的行相关联arrarr还要注意列表和列表之间的紧密关联

In [126]: lol = [[0,1,2],[3,4,5]]

In [127]: lol[0]
Out[127]: [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

当然,对于列表列表,lol[0]返回第一是完全有意义的,即[0, 1, 2]arr[0]行为方式相同——它返回看起来像一行的内容

同样,如果沿第二个轴进行切片,您将得到一列。

In [125]: arr[:, 0]
Out[125]: array([0, 3])
Run Code Online (Sandbox Code Playgroud)

一般来说,索引的顺序与轴的顺序匹配。首先是 0 轴,其次是 1 轴,依此类推。

因此,在 2D 数组中,0 轴与行关联,1 轴与列关联。

如果您考虑沿 x 和 y 轴排列数组的元素,这对您来说可能看起来是倒退的。在几何中,x 轴通常指向右侧,y 轴垂直。因此,在几何中,坐标 (x, y) 首先给出水平索引,然后给出垂直索引。

当索引数组时,由于上面所示的原因,关联会被颠倒。