0

我有一个用于映射的数组。让我们称之为my_map,类型浮动形状(m,c)。

我有第二个带索引的数组,以免调用它my_indexes,输入 int size (n,c),每个值都在 0 和 m 之间。

当我期待(n,c)时,试图索引my_mapmy_ans = my_map[my_indexes]得到一个形状数组(n,c,c)。正确的方法是什么?

为了清楚起见,我想做的是相当于:

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

1 回答 1

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]

于 2019-02-07T19:55:14.263 回答