坏脾气的索引广播引入了新的维度

时间:2019-02-07 18:32:00

标签: python numpy numpy-broadcasting numpy-indexing

我想使用一个数组进行映射。我们称它为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]]

1 个答案:

答案 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,:]

它正在使用idxarr中选择整行,因此结果是idx的形状加上arr的最后一个维度。您想要的只是ith行的idx[j,i]元素。