Python 如何基于双标记列表获取数组元素?

Python 如何基于双标记列表获取数组元素?,python,python-3.x,list,numpy,indexing,Python,Python 3.x,List,Numpy,Indexing,如何使用numpy根据两个索引列表(最好是平坦的)高效地返回数组z的元素 输出: z = np.arange(15).reshape(3,5) index1 = [0,2,0,1] index2 = [1,2,4,4] # Kinda like manually doing z[0][1] z[2][2] z[0][4] z[1][4] 谢谢,正如@Quang-Hoang所说,这很简单 >> array([ 1, 12, 4, 9]) 我之前回答过类似的问题吗?无论如何,我

如何使用numpy根据两个索引列表(最好是平坦的)高效地返回数组z的元素

输出:

z = np.arange(15).reshape(3,5)
index1 = [0,2,0,1]
index2 = [1,2,4,4]

# Kinda like manually doing
z[0][1]
z[2][2]
z[0][4]
z[1][4]

谢谢,

正如@Quang-Hoang所说,这很简单

>> array([ 1, 12,  4,  9])

我之前回答过类似的问题吗?无论如何,我想你可能想在numpy索引页面上读一下。这将概述使用numpy进行索引的所有方法。我将简要概述一下

基本上有两种索引方法,基本方法不复制数据,只允许查看数组中的数据(主要通过切片和整数坐标完成),高级方法复制数据。通常,如果提供切片、整数、元组、列表、数组或布尔数组,numpy的行为会有所不同

在上面的示例中,您似乎对高级索引感兴趣。高级索引是指在新数组中指定要使用另一个数组生成的每个点的坐标。Numpy“知道”您需要高级,因为您使用列表指定对数组的任意坐标访问。例如,假设我想使用(3,5)中的信息生成(2,2)。我想访问[[(0,0),(1,2)],[(2,2),(2,1)]处的坐标。我们会这样做:

z = np.arange(15).reshape(3,5)
index1 = [0,2,0,1]
index2 = [1,2,4,4]

z[index1,index2]
如果我们想创建一个(4,),我们会:

z = np.arange(15).reshape(3,5)
#   1st dim         2nd dim
z[  [[0,1],[2,2]],  [[0,2],[2,1]]  ]
上面的两个例子是明确的。每个坐标都已指定。当然,numpy比直白更聪明。如果第一个dim数组和第二个dim数组的形状不同,那么python假定您希望这些数组一起广播。比如说,

z = np.arange(15).reshape(3,5)
#   1st dim     2nd dim
z[  [0,1,2,2],  [0,2,2,1]  ]
这里我们访问了第0行和第2行以及第1、2、2、3、1列。由于第一个坐标是a(2,1),第二个坐标是a(5,),因此,这将广播到一个(2,5)形状。此广播的工作方式与numpy中的任何其他广播完全相同,例如,添加两个阵列。如果无法将第一个dim和第二个dim数组添加在一起,则它们也不能用于索引。让我们检查一下:

z = np.arange(15).reshape(3,5)
#   1st dim     2nd dim
z[  [[0],[2]],  [1,2,2,3,1]  ]
这将生成与上面示例相同的形状,但在每个位置,我们都将x坐标和y坐标添加在一起,而不是使用它们访问另一个数组中x和y坐标处的值。注意:np.array([0,2])+np.array([1,2,2,3,1])不能一起广播,因此您需要在0和2周围添加[]


无论如何,希望这有帮助。

z[index1,index2]
np.array([[0],[2]]) + np.array([1,2,2,3,1])