用numpy中的3d数组索引2d数组

罗舒

我有两个数组。

“ a”,一个二维numpy数组。

import numpy.random as npr

a = array([[5,6,7,8,9],[10,11,12,14,15]])
array([[ 5,  6,  7,  8,  9],
       [10, 11, 12, 14, 15]])

“ idx”,一个3d numpy数组,它构成三个索引变体,我想用它们来索引“ a”。

idx = npr.randint(5, size=(nsamp,shape(a)[0], shape(a)[1]))
array([[[1, 2, 1, 3, 4],
        [2, 0, 2, 0, 1]],

       [[0, 0, 3, 2, 0],
        [1, 3, 2, 0, 3]],

       [[2, 1, 0, 1, 4],
        [1, 1, 0, 1, 0]]])

现在,我想使用“ idx”中的索引对“ a”进行索引三遍,以获取一个对象,如下所示:

array([[[6, 7, 6, 8, 9],
        [12, 10, 12, 10, 11]],

       [[5, 5, 8, 7, 5],
        [11, 14, 12, 10, 14]],

       [[7, 6, 5, 6, 9],
        [11, 11, 10, 11, 10]]])

天真的“ a [idx]”不起作用。关于如何执行此操作的任何想法?(我使用Python 3.4和numpy 1.9)

亚历克斯·赖利

您可以用来choose从中进行选择a

>>> np.choose(idx, a.T[:,:,np.newaxis])
array([[[ 6,  7,  6,  8,  9],
        [12, 10, 12, 10, 11]],

       [[ 5,  5,  8,  7,  5],
        [11, 14, 12, 10, 14]],

       [[ 7,  6,  5,  6,  9],
        [11, 11, 10, 11, 10]]])

如您所见,a必须先从具有形状(2, 5)的数组重塑为具有形状的数组(5, 2, 1)从本质上讲,这是可以广播的idx,具有形状(3, 2, 5)

(我从这里的@immerrr的答案中学到了这种方法:https ://stackoverflow.com/a/26225395/3923281

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章