Numpy 如何使用依赖于行的数组对多维数组进行索引?
我有一个手动方法来引用numpy数组,但不知道如何以类似numpy的方式进行引用 我正在寻找一款类似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([
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]