如何使用与行相关的数组索引多维数组?

时间:2019-08-25 16:42:25

标签: numpy numpy-ndarray

我有一个手动的方式来引用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 [:]表示整行,而不是只选择一个对应的值。

这必须非常简单,我只是被卡在了上面。没有长长的一行来手动为每一行带来每个索引,就想不出办法了。就我而言,我有数千行和数千列,因此绝对不能使用手动方式。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)组索引对。要了解具有多个列表或数组的advanced indexing,您需要了解广播。

如果一维数组/列表的大小匹配,则广播是微不足道的-只需将它们配对即可:

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