为了说明和测试您的问题,定义简单、真实的数组:
In [44]: arr = np.arange(12).reshape(3,4)
In [45]: idx = np.array([[0,2,1,0],[2,2,1,0]])
In [46]: arr.shape
Out[46]: (3, 4)
In [47]: idx.shape
Out[47]: (2, 4)
您想要的计算:
In [48]: res = np.zeros((2,4), int)
In [49]: for i in range(4):
...: res[:,i] = arr[:,i][idx[:,i]] # same as arr[idx[:,i], i]
...:
In [50]: res
Out[50]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
对一个索引步骤执行相同操作:
In [51]: arr[idx, np.arange(4)]
Out[51]:
array([[0, 9, 6, 3],
[8, 9, 6, 3]])
这是相互广播两个索引数组,然后选择点:
In [52]: np.broadcast_arrays(idx, np.arange(4))
Out[52]:
[array([[0, 2, 1, 0],
[2, 2, 1, 0]]),
array([[0, 1, 2, 3],
[0, 1, 2, 3]])]
所以我们用 2 个 (n,c) 数组索引 (m,c) 数组
以下是相同的:
arr[idx] arr[idx, :]
它idx
用于从 中选择整行arr
,因此结果是 的形状idx
加上 的最后一个维度arr
。你想要的只是行的ith
元素idx[j,i]
。