【问题标题】:How to index multi-dimensional array with an array that is row-dependent?如何使用与行相关的数组索引多维数组?
【发布时间】:2019-08-25 16:42:25
【问题描述】:

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

我正在寻找类似于以下行的类似 numpy 的内容:

np.array([arr[0,index[0]], arr[1,index[1]], arr[2,index[2]]]).reshape(3,1)

这里是代码(简化以查明问题):

arr = np.arange(9).reshape(3,3)
index = np.array([2,0,1])
print(arr)
result = np.array([arr[0,index[0]], arr[1,index[1]], arr[2,index[2]]]).reshape(3,1)
print(result)

它产生以下内容:

[[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[:]]

显然,这不能正常工作,因为 index[:] 表示整行而不是只选择一个对应的值。

这一定很简单,我只是莫名其妙地坚持了下来。如果没有手动为每一行带来每个索引的长线,无法弄清楚如何做到这一点。就我而言,我有数千行和数千列,所以绝对不能使用手动方式。

【问题讨论】:

  • @Divakar 我浏览了引用的帖子,并想出了我的问题的答案: arr[[0,1,2],index] 完全符合我的需要。但我仍然无法理解它是如何工作的,为什么它会这样做。我是 numpy 的新手,非常感谢一些帮助。更具体地说,numpy 究竟如何处理 2 条看起来非常相似的完全不同的指令:1) arr[0:3,index] 和 2) arr[[0,1,2],index]

标签: numpy numpy-ndarray


【解决方案1】:

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

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 索引还有很多技巧,它们的文档总是一个很好的信息来源:https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

【讨论】:

    【解决方案2】:

    对于[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) 索引对。要了解具有多个列表或数组的advanced indexing,您需要了解广播。

    在大小匹配的一维数组/列表的情况下,广播是微不足道的 - 只需将它们配对:

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

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多