我想使用一个数组进行映射。我们称它为my_map
,键入浮点形状(m,c)。
我有第二个带有索引的数组,以免称为my_indexes
,键入int size(n,c),每个值都在0到m之间。
在进行my_map
时尝试索引my_ans = my_map[my_indexes]
时,当我期望(n,c)时得到一个形状为(n,c,c)的数组。正确的方法是什么?
请明确说明,我要执行的操作等同于:
my_ans = np.empty_like(touch_probability)
for i in range(c):
my_ans[:,i] = my_map[:,i][my_indexes[:,i]]
答案 0 :(得分:0)
要说明和测试您的问题,请定义简单的实际数组:
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]
元素。