我有一个手动的方式来引用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 [:]表示整行,而不是只选择一个对应的值。
这必须非常简单,我只是被卡在了上面。没有长长的一行来手动为每一行带来每个索引,就想不出办法了。就我而言,我有数千行和数千列,因此绝对不能使用手动方式。
答案 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]