NumPy的索引广播介绍了新的维度

问题描述 投票:0回答:1

我有一个数组我湾用于映射。让我们把它叫做my_map,浮点型形状(M,C)。

我有索引的第二阵列,以免称之为my_indexes,int类型尺寸(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]]
python numpy numpy-broadcasting numpy-indexing
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]])]

因此,我们索引(M,C)阵列2(N,C)阵列


以下是一样的:

ARR [IDX] ARR [IDX,:]

它使用idx选择从arr整个行,所以结果是idx的外形加上arr的最后一个维度。凡为你想要的仅仅是ith行的idx[j,i]元素。

© www.soinside.com 2019 - 2024. All rights reserved.