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

Ich mag M erzeugen, wobei jeder Eintrag in M ​​als M[r,c] == X[r, y[r]] definiert ist; Verwenden Sie y, um in die entsprechende Spalte von X zu indizieren.numpy: Efficient Weise einen 1D-Array als ein Index in 2D-Arrays zu verwenden

Wie kann ich das effizient (ohne Schleifen) machen?

M könnte eine einzelne Spalte haben, obwohl ich sie schließlich senden muss, so dass es die gleiche Form wie X hat. c beginnt von der ersten Spalte X (0) und geht bis zum letzten (9).

+0

Was ist die erwartete Form für 'M'? Wie ist das 'c' Setup? – Divakar

Antwort

0

Just do:

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

M=X[range(10),Y] 

für

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

Danke! Kannst du mir bitte erklären, wie das funktioniert? Ich habe es schwer gefunden, den Zugang von numpy zu Broadcasting und Arracy von Voodoo zu unterscheiden. – SRobertJames

+0

Auch: Dieser 'Bereich' ist ein Python-Objekt, und für sehr große Arrays (die ich verwende), wird langsam sein. Können wir es stattdessen mit einem Numpy-Array tun? – SRobertJames

+0

'np.arange (10)' funktioniert genauso gut wie 'range (10)'. – hpaulj

Verwandte Themen