Numpy 索引广播引入了新的维度

Numpy indexing broadcasting introduces new dimension

我有一个要用于映射的数组。我们称它为 my_map ,输入 float shape (m,c).

我有第二个带索引的数组,以免称它为my_indexes,类型为int size (n,c),每个值都在0到m之间。

尝试索引 my_mapmy_ans = my_map[my_indexes] 我得到一个形状数组 (n,c,c),而我期望的是 (n,c)。正确的做法是什么?

明确一点,我要做的是等同于:

my_ans = np.empty_like(touch_probability)
for i in range(c):
    my_ans[:,i] = my_map[:,i][my_indexes[:,i]]

为了说明和测试您的问题,请定义简单、真实的数组:

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 到 select 来自 arr 的整行,所以结果是 idx 的形状加上 arr 的最后一个维度。你想要的只是 idx[j,i] 行的 ith 元素。