我之前有没有回答过类似的问题?无论如何,我想你可能想在 numpy 索引页面上阅读,https://numpy.org/doc/stable/reference/arrays.indexing.html。这将概述在 numpy 中建立索引的所有方法。我将简要介绍一下。
基本上有两种索引方法,BASIC 不复制数据,只是让您查看数组中的数据(主要通过切片和整数坐标完成),以及 ADVANCED,它制作数据的副本.一般来说,如果您提供切片、整数、元组、列表或数组或布尔数组,numpy 的行为会有所不同。
在您上面的示例中,您似乎对高级索引感兴趣。高级索引是当您指定要使用另一个数组制作的新数组中的每个点的坐标时。 Numpy“知道”您想要高级,因为您使用列表来指定对数组的任意坐标访问。例如,假设我想使用 (3,5) 中的信息制作 (2,2)。我想访问 [[(0,0),(1,2)],[(2,2),(2,1)]] 处的坐标。我们会这样做:
z = np.arange(15).reshape(3,5)
# 1st dim 2nd dim
z[ [[0,1],[2,2]], [[0,2],[2,1]] ]
如果我们想创建一个 (4,),我们会这样做:
z = np.arange(15).reshape(3,5)
# 1st dim 2nd dim
z[ [0,1,2,2], [0,2,2,1] ]
上面的两个例子是显式的。每个坐标都已指定。当然 numpy 比 EXPLICIT 更聪明。如果第一个 dim 数组和第二个 dim 数组的形状不同,则 python 假设您希望将这些数组一起广播。举个例子,
z = np.arange(15).reshape(3,5)
# 1st dim 2nd dim
z[ [[0],[2]], [1,2,2,3,1] ]
在这里,我们访问了第 0 行和第 2 行以及第 1、2、2、3、1 列。此广播为 (2,5) 形状,因为第一个坐标是 (2,1),第二个坐标是 (5,)。这种广播的工作方式与 numpy 中的任何其他广播完全相同,例如添加两个数组。如果第一个暗淡和第二个暗淡数组不能加在一起,那么它们也不能用于索引。让我们检查一下:
np.array([[0],[2]]) + np.array([1,2,2,3,1])
这会产生与上面示例相同的形状,但在每个位置我们都将 x 坐标和 y 坐标添加在一起,而不是使用它们来访问另一个数组中 x 和 y 坐标处的值。注意:np.array([0,2]) + np.array([1,2,2,3,1]) 不能一起广播,所以你需要在 0 和 2 周围加上额外的 []。
无论如何,希望这会有所帮助。