numpy:使用一维数组作为二维数组索引的有效方法

numpy:使用一维数组作为二维数组索引的有效方法,numpy,vectorization,Numpy,Vectorization,我想生成M,其中M中的每个条目定义为M[r,c]==X[r,y[r]];也就是说,使用y索引到X的相应列中 我如何才能有效地完成这项工作(没有循环) M可以有一个列,但最终我需要广播它,使其具有与X相同的形状c从X(0)的第一列开始,到最后一列(9)。只需执行以下操作: X.shape == (10,4) y.shape == (10) 为了 M的预期形状是什么?这是怎样的c设置?谢谢!你能解释一下这是怎么回事吗?我发现很难区分numpy的广播和数组访问与voodoo。另外:range是Pyt

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

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

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

只需执行以下操作:

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


M
的预期形状是什么?这是怎样的
c
设置?谢谢!你能解释一下这是怎么回事吗?我发现很难区分numpy的广播和数组访问与voodoo。另外:
range
是Python对象,对于非常大的数组(我正在使用),速度会很慢。我们可以用Numpy数组代替吗?但是
np.array(范围(100000))
np.arange(100000)
慢得多,即使在python3上也是如此。在numpy中解决这一问题并不难,尽管
X[np.arange(10),Y]
更快,但它确实应该在更大的数组上进行测试。@SRobertames:Python索引描述如下。
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])