Numpy 如何使用依赖于行的数组对多维数组进行索引?

Numpy 如何使用依赖于行的数组对多维数组进行索引?,numpy,numpy-ndarray,Numpy,Numpy Ndarray,我有一个手动方法来引用numpy数组,但不知道如何以类似numpy的方式进行引用 我正在寻找一款类似numpy的产品,它相当于以下产品: np.array([arr[0,index[0]], arr[1,index[1]], arr[2,index[2]]]).reshape(3,1) 以下是代码(经过简化以查明问题): 它产生以下结果: [[0 1 2] [3 4 5] [6 7 8]] [[2] [3] [7]] 我正在寻找numpy风格的代码,以实现什么行 np.array([

我有一个手动方法来引用numpy数组,但不知道如何以类似numpy的方式进行引用

我正在寻找一款类似numpy的产品,它相当于以下产品:

np.array([arr[0,index[0]], arr[1,index[1]], arr[2,index[2]]]).reshape(3,1)
以下是代码(经过简化以查明问题):

它产生以下结果:

[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[2]
 [3]
 [7]]
我正在寻找numpy风格的代码,以实现什么行

np.array([arr[0,index[0]], arr[1,index[1]], arr[2,index[2]]]).reshape(3,1)
在这里做什么,例如:

arr[:,index[:]]
显然,这是不正确的,因为索引[:]表示整行,而不是只选取一个对应的值


这一定很简单,我只是不知怎的被它卡住了。如果没有为每一行手动引入每个索引的长行,则无法理解如何执行此操作。在我的例子中,我有数千行和数千列,因此绝对不能使用手动方式。

实现目标的最简单方法可能是直接索引:

arr = np.arange(9).reshape(3,3)
index = np.array([2,0,1])
result = arr[range(index.shape[0]), index].reshape(index.shape[0], 1)
为了回答您的评论,请说明切片不能产生相同结果的原因,即代码如下

arr[0:index.shape[0], index]
这是因为
0:index.shape[0]
是一个切片,而不是要拾取的索引列表。无论何时使用切片作为索引,它都理解为范围内的所有行或范围内的所有列。但是,如果改为列出索引(通过列表或数组),它将仅从列表中拾取元素


NumPy索引还有很多技巧,它们的文档始终是一个很好的信息来源:。

实现目标的最简单方法可能是直接索引:

arr = np.arange(9).reshape(3,3)
index = np.array([2,0,1])
result = arr[range(index.shape[0]), index].reshape(index.shape[0], 1)
为了回答您的评论,请说明切片不能产生相同结果的原因,即代码如下

arr[0:index.shape[0], index]
这是因为
0:index.shape[0]
是一个切片,而不是要拾取的索引列表。无论何时使用切片作为索引,它都理解为范围内的所有行或范围内的所有列。但是,如果改为列出索引(通过列表或数组),它将仅从列表中拾取元素


NumPy索引还有很多技巧,它们的文档总是一个很好的信息来源:.

行选择
[0,1,2]
行和
[2,0,1]
列有两种选择项目的方法:

block
items [2,0,1] from each of the rows [0,1,2]

paired
items [0,2], [1,0], [2,1]
在MATLAB中,如果索引
arr([0,1,2],[2,0,1])
则得到块。在
numpy
索引中
arr[[0,1,2],[2,0,1]]
执行所需的成对索引

要在
numpy
中获取块,可以执行
arr[:,[2,0,1]]
arr[[0],[1],[2]],[2,0,1]

第二种情况实际上是生成一个(3,1)数组,该数组使用(3,)进行广播,以创建一组(3,3)索引对。要了解具有多个列表或数组的
高级索引
,您需要了解广播

对于大小匹配的1d数组/列表,广播很简单-只需将它们配对即可:

arr([0,1,2],[2,0,1])
arr[0,2], arr[1,0], arr[2,1]

当行选择为
[0,1,2]
行和
[2,0,1]
列时,有两种选择项目的方法:

block
items [2,0,1] from each of the rows [0,1,2]

paired
items [0,2], [1,0], [2,1]
在MATLAB中,如果索引
arr([0,1,2],[2,0,1])
则得到块。在
numpy
索引中
arr[[0,1,2],[2,0,1]]
执行所需的成对索引

要在
numpy
中获取块,可以执行
arr[:,[2,0,1]]
arr[[0],[1],[2]],[2,0,1]

第二种情况实际上是生成一个(3,1)数组,该数组使用(3,)进行广播,以创建一组(3,3)索引对。要了解具有多个列表或数组的
高级索引
,您需要了解广播

对于大小匹配的1d数组/列表,广播很简单-只需将它们配对即可:

arr([0,1,2],[2,0,1])
arr[0,2], arr[1,0], arr[2,1]

@Divakar我浏览了引用的帖子,找到了我问题的答案:arr[[0,1,2],index]正是我所需要的。但我仍然不明白它是如何工作的,为什么它会这样做。我是numpy的新手,非常感谢您的帮助。更具体地说,numpy是如何处理两个看起来非常相似的完全不同的指令的:1)arr[0:3,index]和2)arr[[0,1,2],index]@Divakar我浏览了参考文章,找到了我问题的答案:arr[[0,1,2],index]正是我需要的。但我仍然不明白它是如何工作的,为什么它会这样做。我是numpy的新手,非常感谢您的帮助。更具体地说,numpy是如何处理两个看起来非常相似的完全不同的指令的:1)arr[0:3,index]和2)arr[[0,1,2],index]