这个 numpy 高级索引代码是如何工作的?
How this numpy advance indexing code works?
我正在学习 numpy framework.This 一段代码我不明白。
import numpy as np
a =np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
row = np.array([[0,0],[3,3]])
col = np.array([[0,2],[0,2]])
b = a[row,col]
print("This is b array:",b)
这个b
数组returnsa
数组的角值,即b
等于[[0,2],[9,11]]
.
多尝试,多看例子,就可以理解了。
如果你有一维索引:
In [58]: np.arange(10)[np.array([1,3,4,6])]
Out[58]: array([1, 3, 4, 6])
如果是二维索引:
In [57]: np.arange(10)[np.array([[1,3],[4,6]])]
Out[57]:
array([[1, 3],
[4, 6]])
如果使用 3 维索引:
In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]:
array([[[1],
[3]],
[[4],
[6]]])
如您所见,如果您在索引中创建层次结构,您也会在输出中得到它。
按步骤进行:
import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
给出二维数组a
:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
然后:
row = np.array([[0,0],[3,3]])
分配给二维数组 row
值 [0,0]
和 [3,3]
:
array([[0, 0],
[3, 3]])
然后:
col = np.array([[0,2],[0,2]])
分配给二维数组 col
值 [0,2]
和 [0,2]
:
array([[0, 2],
[0, 2]])
最后:
b = a[row,col]
将第一行 a[0,0]
、a[0,2]
、第二行 a[3,0]
、a[3,2]
给出的值赋给 b
,即:
array([[ 0, 2],
[ 9, 11]])
b[0,0]
<-- a[0,0]
从何而来?它来自 row[0,0]
0 和 col[0,0]
0 的组合。
b[0,1]
<-- a[0,2]
呢?它来自 row[0,1]
0 和 col[0,1]
2 的组合。
等等。
使用数组或"array-like"对数组元素进行access/modify索引时,称为高级索引。
In [37]: a
Out[37]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [38]: row
Out[38]:
array([[0, 0],
[3, 3]])
In [39]: col
Out[39]:
array([[0, 2],
[0, 2]])
In [40]: a[row, col]
Out[40]:
array([[ 0, 2],
[ 9, 11]])
这就是你得到的。下面是解释:
Indices of
`a[row, col]` row column
|| || || ||
VV VV VV VV
a[0, 0] a[0, 2]
a[3, 0] a[3, 2]
|__________| |
row-idx array |
|__________|
column-idx array
您正在使用两个形状相同的 2d-arrays
对 a
进行索引,因此您的输出数组也将具有与 col
和 row
相同的形状。为了更好地理解 array indexing
的工作原理,您可以查看 docs,如图所示,在给定数组的现有轴上使用 1d-arrays
进行索引的工作方式如下:
result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
..., ind_N[i_1, ..., i_M]]
同样的逻辑适用于在每个轴上使用 2d-arrays
进行索引的情况,但是您将拥有一个 result
数组,最多 i_N_M
个索引。
因此回到您的示例,您实际上是根据 row
从 a
的行中进行选择,而从那些 rows
的行中选择一些列 col
.您可能会发现将行和列索引转换为 (x,y)
坐标更直观:
(0,0), (0,2)
(3,0), (3,2)
通过相应地从 a
中进行选择,结果是输出数组:
print(a[row,col])
array([[ 0, 2],
[ 9, 11]])
我正在学习 numpy framework.This 一段代码我不明白。
import numpy as np
a =np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
row = np.array([[0,0],[3,3]])
col = np.array([[0,2],[0,2]])
b = a[row,col]
print("This is b array:",b)
这个b
数组returnsa
数组的角值,即b
等于[[0,2],[9,11]]
.
多尝试,多看例子,就可以理解了。
如果你有一维索引:
In [58]: np.arange(10)[np.array([1,3,4,6])]
Out[58]: array([1, 3, 4, 6])
如果是二维索引:
In [57]: np.arange(10)[np.array([[1,3],[4,6]])]
Out[57]:
array([[1, 3],
[4, 6]])
如果使用 3 维索引:
In [59]: np.arange(10)[np.array([[[1],[3]],[[4],[6]]])]
Out[59]:
array([[[1],
[3]],
[[4],
[6]]])
如您所见,如果您在索引中创建层次结构,您也会在输出中得到它。
按步骤进行:
import numpy as np
a = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print(a)
给出二维数组a
:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
然后:
row = np.array([[0,0],[3,3]])
分配给二维数组 row
值 [0,0]
和 [3,3]
:
array([[0, 0],
[3, 3]])
然后:
col = np.array([[0,2],[0,2]])
分配给二维数组 col
值 [0,2]
和 [0,2]
:
array([[0, 2],
[0, 2]])
最后:
b = a[row,col]
将第一行 a[0,0]
、a[0,2]
、第二行 a[3,0]
、a[3,2]
给出的值赋给 b
,即:
array([[ 0, 2],
[ 9, 11]])
b[0,0]
<-- a[0,0]
从何而来?它来自 row[0,0]
0 和 col[0,0]
0 的组合。
b[0,1]
<-- a[0,2]
呢?它来自 row[0,1]
0 和 col[0,1]
2 的组合。
等等。
使用数组或"array-like"对数组元素进行access/modify索引时,称为高级索引。
In [37]: a
Out[37]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [38]: row
Out[38]:
array([[0, 0],
[3, 3]])
In [39]: col
Out[39]:
array([[0, 2],
[0, 2]])
In [40]: a[row, col]
Out[40]:
array([[ 0, 2],
[ 9, 11]])
这就是你得到的。下面是解释:
Indices of
`a[row, col]` row column
|| || || ||
VV VV VV VV
a[0, 0] a[0, 2]
a[3, 0] a[3, 2]
|__________| |
row-idx array |
|__________|
column-idx array
您正在使用两个形状相同的 2d-arrays
对 a
进行索引,因此您的输出数组也将具有与 col
和 row
相同的形状。为了更好地理解 array indexing
的工作原理,您可以查看 docs,如图所示,在给定数组的现有轴上使用 1d-arrays
进行索引的工作方式如下:
result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M], ..., ind_N[i_1, ..., i_M]]
同样的逻辑适用于在每个轴上使用 2d-arrays
进行索引的情况,但是您将拥有一个 result
数组,最多 i_N_M
个索引。
因此回到您的示例,您实际上是根据 row
从 a
的行中进行选择,而从那些 rows
的行中选择一些列 col
.您可能会发现将行和列索引转换为 (x,y)
坐标更直观:
(0,0), (0,2)
(3,0), (3,2)
通过相应地从 a
中进行选择,结果是输出数组:
print(a[row,col])
array([[ 0, 2],
[ 9, 11]])