2017-06-30 20 views
1
X.shape == (10,4) 
y.shape == (10) 

我想產生M,其中M中的每個條目被定義爲M[r,c] == X[r, y[r]];即使用y來索引X的相應列。numpy的:使用一維數組作爲一個指數到2D陣列的高效方式

我該如何有效地做到這一點(無循環)?

M可以有一個列,但最終我需要廣播它,以便它具有與X相同的形狀。 cX(0)的第一列開始,到最後一列(9)。

+0

什麼的'M'預期的形狀?這個'c'設置如何? – Divakar

回答

0

只要做到:

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]) 
+0

謝謝!你能解釋一下這是如何工作的嗎?我發現很難區分numpy的廣播和巫術的入侵。 – SRobertJames

+0

另外:'range'是一個Python對象,對於非常大的數組(我正在使用它),速度會很慢。我們可以使用Numpy數組來代替它嗎? – SRobertJames

+0

'np.arange(10)'和'range(10)'一樣好。 – hpaulj

相關問題