2017-09-15 4 views
2

J'ai un tableau de 2x3 comme ce qui suit:Appliquer Index variable sur plusieurs colonnes d'une matrice

import numpy as np  
y = np.array([[1,2,3], [4,5,6]]) 

Je veux indexer un élément de chaque colonne. Par exemple, le 1er élément dans la colonne 1, le 2ème élément dans la colonne 2, et le 1er élément dans la colonne 3. La sortie devrait ressembler à ceci:

ans = [1,5,3] 

J'ai essayé d'utiliser

y[0,1,0] 

et

np.take(y, [0,1,0,1], axis=1) 

mais aucune n'a fonctionné. Pouvez-vous aider?

Répondre

0

vous devriez y accéder de cette façon:

>>> y 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> y[0,0] 
1 
>>> y[1,1] 
5 
>>> y[0,2] 
3 
>>> [y[0,0], y[1,1],y[0,2]] 
[1, 5, 3] 

tableau numpy est référence avec les coordonnées [x, y] dans votre tableau. Ensuite, vous pouvez trouver une stratégie pour résoudre un problème spécifique, avec une logique spécifique:

>>> y 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> res=[y[j%2,j] for j in range(y.shape[1])] 
>>> res 
[1, 5, 3] 
>>> y = np.array([[1,1,1,1,1,1,1,1],[4,5,6,7,8,9,10,11]]) 
>>> res=[y[j%2,j] for j in range(y.shape[1])] 
>>> res 
[1, 5, 1, 7, 1, 9, 1, 11] 

EDIT:

>>> idxCol=[0,1,0] 
>>> res=[y[idxCol[i],i] for i in range(len(idxCol))] 
>>> res 
[1, 5, 3] 
+0

Salut Dadep, dans ma question initiale l'index est quelque chose comme [0,1,0], mais dans mon vrai problème, l'index est donné, comme Index = [9,2,11,3, ... ] Donc j'ai probablement besoin de deux 'For Loops'? <<< début du code >>> res = [y [i, j] pour j dans la gamme (y.shape [1]) et pour i dans Index] <<< fin du code >>> Je connais le code I écrit est incorrect. Pourriez-vous montrer la bonne façon d'écrire ce code de ligne avec deux pour les boucles? – user7269791

+0

voir modifier dans mon message si vous êtes sûr que votre liste d'index a la même taille que le nombre de colonne, il devrait fonctionner de cette façon – Dadep

0
In [448]: y = np.array([[1,2,3], [4,5,6]]) 
In [450]: idx = [0,1,0] 

idx sélectionne la ligne pour les colonnes successives, de sorte que vous devez lier avec une liste d'indexation de colonnes (ou tableau):

In [454]: y[idx,[0,1,2]] 
Out[454]: array([1, 5, 3]) 
In [455]: y[idx, np.arange(y.shape[1])] 
Out[455]: array([1, 5, 3]) 

peut aider à visualiser en prenant la « transposition » des 2 listes:

In [456]: list(zip([0,1,0],[0,1,2])) 
Out[456]: [(0, 0), (1, 1), (0, 2)] 
In [457]: [y[i,j] for i,j in Out[456]] 
Out[457]: [1, 5, 3] 

Il faudrait le faire de cette façon avec des listes, mais numpy fait la paire pour vous.