numpy:使用1D数组作为2D数组索引的有效方法

时间:2017-06-30 21:06:52

标签: numpy vectorization

X.shape == (10,4)
y.shape == (10)

我想生成M,其中M中的每个条目都定义为M[r,c] == X[r, y[r]];也就是说,使用y索引到X的相应列。

如何有效地完成这项工作(没有循环)?

M可以有一个列,但最终我需要广播它,以便它具有与X相同的形状。 cX(0)的第一个col开始,然后转到最后一个(9)。

1 个答案:

答案 0 :(得分:2)

只是做:

X=np.arange(40).reshape(10,4)
Y=np.random.randint(0,4,10)

M=X[range(10),Y]

In [8]: X
Out[8]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31],
       [32, 33, 34, 35],
       [36, 37, 38, 39]])

In [9]: Y
Out[9]: array([1, 1, 3, 3, 1, 2, 2, 3, 2, 1])

In [10]: M
Out[10]: array([ 1,  5, 11, 15, 17, 22, 26, 31, 34, 37])